![]() |
Re: Timer stoppen
Zitat:
|
Re: Timer stoppen
[OT] Oh shit, ich bin als Zyniker entlarvt :mrgreen: [/OT]
|
Re: Timer stoppen
Zitat:
Löschen die Moderatoren den Unfug hier eigentlich wieder? Besser fänd ich das schon. Das is nix fürs Archiv :gruebel: [/OT] |
Re: Timer stoppen
gelöscht wirds nicht (auch sowas muss ab und zu sein sonst fehlt das persönliche und wir können uns gleich ein trockenes Lehrbuch nehmen) aber jetzt kommt ein dezenter Hinweis:
Lasst uns zum Thema zurück kommen :wink: |
Re: Timer stoppen
Hi,
ja stimmt, der Timer (so einfach er eigentlich ist) kann einem mit Application.ProcessMessages schlimme Probleme bereiten. Ich habe es jetzt so gelöst, dass er sich nicht selbst überholen kann:
Delphi-Quellcode:
TTimer(Sender).Enabled:=false;
.. .. .. .. .. TTimer(Sender).Enabled:=TimerSollLaufen; Wenn ich jetzt extern das Flag TimerSollLaufen auf False setze, dann wird der Timer nach Ablauf der OnTimer Prozedur beendet. Meine Frage ist nun, wie kann ich mir sicher sein, dass er wirklich beendet ist?! Ich habe den Timer.Tag dazu genutzt, mir anzuzeigen, ob er noch aktiv ist (1) oder beendet ist (0), doch wenn ich auf dieses Flag polle, dann bleibt der Timer einfach stehen! Gibt es dafür eine Erkärung?!
Delphi-Quellcode:
while tmrAblauf.Tag >0 do
begin Application.ProcessMessages; end; // Hier kommt er dann nie hin |
Re: Timer stoppen
*push* :roll:
|
Re: Timer stoppen
Wo setzt Du das Tag? Was machst Du sonst noch im Timer-Event? Wo steht die while-Schleife? Ohne den Kontext, in dem die Codeschnipsel stehen, kann ich mir keinen Kopp um Dein Problem machen. Mehr Code! Ich brauch mehr Code! :zwinker:
|
Re: Timer stoppen
Die vielen Application.ProcessMessages bringen den ganzen Message-Ablauf total durcheinander. In der selben Zeit, in der du versucht hast, dieses Problem zu richten, hättest du schon einen ganzen Thread samt Synchronisation schreiben können.
Zitat:
|
Re: Timer stoppen
Ok du willst Code du kriegst Code :-D
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
var active:Boolean; time1,time2:Cardinal; Failure:Boolean; begin TTimer(Sender).Enabled:=false; active:=False; if TimerIsActive then exit; try if not Assigned(aCS200) then Exit; TimerIsActive:=True; if TimeOut then exit; time1:=GetTickCount; tmrAblauf.Tag:= tmrAblauf.Tag+1; lblRequestVal.Caption:=IntToStr(tmrAblauf.Tag); Failure:=False; case tmrAblauf.Tag of 1 : begin if (aCS200.Get_TempIntern(TempIntern))=0 then begin pbFortschritt.Position:=7; end else begin Failure:=True; end; end; 2 : begin if (aCS200.Get_TempExtern(TempExtern))=0 then begin pbFortschritt.Position:=14; end else begin Failure:=True; end; end; 3 : begin if (aCS200.Get_StoerungsFlags(stoerungsflags))=0 then begin pbFortschritt.Position:=21; end else begin Failure:=True; end; end; 4 : begin if (aCS200.Get_SollWertFanIntern(SollWertFanIntern))=0 then begin pbFortschritt.Position:=28; end else begin Failure:=True; end; end; 5 : begin if (aCS200.Get_FanInternSpeed_1(fan1InternSpeed))=0 then begin pbFortschritt.Position:=35; end else begin Failure:=True; end; end; 6 : begin if (aCS200.Get_Fan1InternPuls(fan1InternPuls))=0 then begin pbFortschritt.Position:=42; end else begin Failure:=True; end; end; 7 : begin if (aCS200.Get_FanInternSpeed_2(fan2InternSpeed))=0 then begin pbFortschritt.Position:=49; end else begin Failure:=True; end; end; 8 : begin if (aCS200.Get_Fan2InternPuls(fan2InternPuls))=0 then begin pbFortschritt.Position:=56; end else begin Failure:=True; end; end; 9 : begin if (aCS200.Get_SollWertFanExtern(SollWertFanExtern))=0 then begin pbFortschritt.Position:=63; end else begin Failure:=True; end; end; 10: begin if (aCS200.Get_FanExternSpeed_1(fan1ExternSpeed))=0 then begin pbFortschritt.Position:=70; end else begin Failure:=True; end; end; 11: begin if (aCS200.Get_FanExternSpeed_2(fan2ExternSpeed))=0 then begin pbFortschritt.Position:=77; end else begin Failure:=True; end; end; 12: begin if (aCS200.Get_Fan1ExternPuls(fan1ExternPuls))=0 then begin pbFortschritt.Position:=84; end else begin Failure:=True; end; end; 13: begin if (aCS200.Get_Fan2ExternPuls(fan2ExternPuls))=0 then begin pbFortschritt.Position:=91; end else begin Failure:=True; end; end; 14: begin if (aCS200.Get_StoerungsFlags(stoerungsflags))=0 then begin pbFortschritt.Position:=95; end else begin Failure:=True; end; end; 15: begin if (aCS200.Get_IOFlags(IOflags))=0 then begin pbFortschritt.Position:=98; end else begin Failure:=True; end; end; 16: begin if (aCS200.Get_StatusFlags(Statusflags))=0 then begin pbFortschritt.Position:=100; end else begin Failure:=True; end; end; 100 +1: begin WriteDataToDevice(Self); end; 200 +1: begin ReadDataFromDevice(Self); end else begin tmrAblauf.Tag := 0; pbFortschritt.Position:=0; end; end; if Failure then begin MessageDlg('Fehler beim Lesen der Daten aus dem Wärmetauscher',mtError,[mbOK],0); exit; end; if TimeOut then begin exit; end; if Assigned(aCS200) then begin if aCS200.FSCI.isConnected then begin if not( (Assigned( aCS200 ))) then Exit; lnAkuelleInnenTemp.Clear; lnAktuelleAussenTemp.Clear; if not(stoerungsflags[8]) then begin // zeichne Aktuelle Innentemp auf Graph "Innenkreis" lnAkuelleInnenTemp.AddXY(TempIntern,-20,'',clBlack); lnAkuelleInnenTemp.AddXY(TempIntern+0.1,120,'',clBlack); // zeichne Aktuelle Innentemp auf Graph "Aussenkreis" lnAktuelleAussenTemp.AddXY(TempIntern,-20,'',clBlack); lnAktuelleAussenTemp.AddXY(TempIntern+0.1,120,'',clBlack); end else begin TempIntern:=-40; end; lblTempInternVal.Caption:=IntToStr(TempIntern) + ' [°C]'; if (Statusflags[7]) then begin // TempFühler Aussen ist wirklich vorhanden lblTempExternVal.Caption:=IntToStr(TempExtern) + ' [°C]'; end else begin lblTempExternVal.Caption:=' --' + ' [°C]'; end; lblSollWertFanInternVal.Caption:=IntToStr(SollWertFanIntern) + ' [%] '; lblFanSpeed1InternVal.Caption:=IntToStr(fan1InternSpeed)+ ' [rpm] ' + ' bei '+IntToStr(fan1InternPuls)+ ' [P/s]'; lblFanSpeed2InternVal.Caption:=IntToStr(fan2InternSpeed)+ ' [rpm]'+ ' bei '+IntToStr(fan2InternPuls)+ ' [P/s]'; lblSollWertFanExternVal.Caption:=IntToStr(SollWertFanExtern) + ' [%] '; lblFanSpeed1ExternVal.Caption:=IntToStr(fan1ExternSpeed)+ ' [rpm] ' + ' bei '+IntToStr(fan1ExternPuls)+ ' [P/s]'; lblFanSpeed2ExternVal.Caption:=IntToStr(fan2ExternSpeed)+ ' [rpm]'+ ' bei '+IntToStr(fan2ExternPuls)+ ' [P/s]'; if IOflags[6] then begin ledTuerkontakt.ColorOn:=clLime; end else begin ledTuerkontakt.ColorOn:=clGray; end; if IOflags[5] then begin ledEndSchalter1.ColorOn:=clLime; end else begin ledEndSchalter1.ColorOn:=clGray; end; if IOflags[4] then begin ledEndSchalter2.ColorOn:=clLime; end else begin ledEndSchalter2.ColorOn:=clGray; end; if IOflags[3] then begin ledInAlarm1.ColorOn:=clLime; end else begin ledInAlarm1.ColorOn:=clGray; end; if IOflags[2] then begin ledInAlarm2.ColorOn:=clLime; end else begin ledInAlarm2.ColorOn:=clGray; end; if IOflags[8] then begin ledAlarm1.ColorOn:=clRed; end else begin ledAlarm1.ColorOn:=clGray; end; if IOflags[9] then begin ledAlarm2.ColorOn:=clRed; end else begin ledAlarm2.ColorOn:=clGray; end; if IOflags[10] then begin ledAlarm3.ColorOn:=clRed; end else begin ledAlarm3.ColorOn:=clGray; end; if IOflags[11] then begin ledHeizung.ColorOn:=clLime; end else begin ledHeizung.ColorOn:=clGray; end; if IOflags[12] then begin ledSammelstoerung.ColorOn:=clLime; end else begin ledSammelstoerung.ColorOn:=clGray; end; if IOflags[13] then begin ledExtern.ColorOn:=clLime; end else begin ledExtern.ColorOn:=clGray; end; if IOflags[14] then begin ledIntern.ColorOn:=clLime; end else begin ledIntern.ColorOn:=clGray; end; // Stoerungsflags lstStoerung.Clear; if stoerungsflags[8] then begin lstStoerung.AddItem('Temp-Sensor (intern) def.',nil); lblTempInternVal.Caption:='-- ' + ' [°C]'; TempIntern:=-40; end; if stoerungsflags[7] then begin lstStoerung.AddItem('Temp-Sensor (extern) def.',nil); lblTempExternVal.Caption:='-- ' + ' [°C]'; end; if stoerungsflags[6] then begin lstStoerung.AddItem('Feuchte-Sensor def.',nil); end; if stoerungsflags[1] then begin lstStoerung.AddItem('Fan-2 (extern) def.',nil); end; if stoerungsflags[2] then begin lstStoerung.AddItem('Fan-1 (extern) def.',nil); end; if stoerungsflags[3] then begin lstStoerung.AddItem('Fan-2 (intern) def.',nil); end; if stoerungsflags[4] then begin lstStoerung.AddItem('Fan-1 (intern) def.',nil); end; if stoerungsflags[5] then begin lstStoerung.AddItem('Heizung def.',nil); end; active:=True; end else begin InitGUI; exit; end; end; time2:=GetTickCount -time1; finally // windows.Beep(1500,200); TTimer(Sender).Enabled:=TimerSollLaufen; if not(TimerSollLaufen) then InitGUI; TimerIsActive:=false; if active then begin ledVerbunden.ColorOn:=clLime;; end else begin ledVerbunden.ColorOn:=clGray; end; end; end; |
Re: Timer stoppen
Nach dem ersten Timer-Event ist tmrAblauf.Tag immer größer Null, richtig?
Und mit den Exit springst du am finally Block vorbei raus. Ist das Absicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz