![]() |
Probleme mit Timer und sleep
Hallo,
ich habe ein problem mit einem Timer in kombination mit sleep. Aus meinem Programm hab ich mal ein paar Zeilen seperiert, bei denen das Problem genau so auftritt:
Delphi-Quellcode:
type Tsensor = record kanal,
wert : integer; lab : Tlabel; End; var sensor : Array[1..2] of Tsensor;
Delphi-Quellcode:
dieser Programmcode hat zur folge, dass beide Labels gleichzeitig ihren Wert und ihre Farbe ändern, vermutet hätte ich aber eine reihenfolge wie:
procedure TForm1.onTimer(Sender: TObject);
var i:integer; begin timer.Enabled:=false; //damit der Timer sich nicht selbst überholt, bzw in 2 instanzen läuft. for i:= 1 to 2 do begin //sende anfrage an einen sensor, messdaten zu erstellen sleep(200); // warte bis sensor wert gewandelt hat inc(sensor[i].wert); // simuliertes auslesen des Sensors sensor[i].lab.caption:=inttostr(sensor[i].wert); // ausgabe sleep(500) // <- auch dieses sleep würde nicht das bewirken, was ich vermutet hätte, // ist aber nur für testzwecke if(sensor[i].lab.Font.Color=clred) then //farbe toggeln um 2 gleiche meßwerte auseinander zu halten. sensor[i].lab.Font.Color:=clblack else sensor[i].lab.Font.Color:=clred; end; timer.Enabled:=true; //bereit für neue timer interrupts end; label 1 wird hochgezählt 500 ms label 1 wird rot 200ms label 2 wird hochgezählt 500ms label 2 wird rot 200ms label 1 wird hochgezählt, 500ms label 1 wird schwarz ... woran liegt das? bin ich nur zu doof das zu verstehen? mir kommt es so vor, als ob alle sleeps aufsummiert werden und ans ende der onTimer Prozedur gepackt werden. ach ja, bei mir läuft der Timer mit 100ms, was in diesem programm wenig sinn macht, aber in dem eigentlichen schon, da die sensoren nur abgefragt werden sollen, wenn sie wirklich dran sind. dafür auch das timer.enabled=true oder false. muß ich mich überhaupt von hand drum kümmern, dass onTimer nicht doppelt aufgerufen wird oder macht das delphi von alleine? |
Re: Probleme mit Timer und sleep
das sleep bewirkt ja, dass dein Programm komplett stehen bleibt d.h. kein aktualisierung der labels passiert. Schon mal mit ProcessMessages gearbeitet und das ausprobiert?
Das macht nämlich eine Pause, arbeitet aber alle Befehle die vorher geschehen sind noch ab... ( ![]() |
Re: Probleme mit Timer und sleep
Liste der Anhänge anzeigen (Anzahl: 1)
mit prozessmessages hab ich noch nicht gearbeitet, aber auch wenn während des Sleeps der Prozess stehen bleibt, sollten doch die zeilen zwischen den sleeps auch dazwischen ausgeführt werden, oder seh ich das falsch?
ich füg das Projekt zum ausprobieren mal in den anhang. Vielleicht verhält es sich ja in anderen Delphi versionen anders... was wären denn möglichkeiten, das Sleep zu umgehen? ich meine, ich hab hier sogar mal 'nen artikel dazu gesehen, werd gleich noch mal schauen. Gruß Martin |
Re: Probleme mit Timer und sleep
habs gerade mal ausprobiert, ich denke, das wars. vielen Dank!
|
Re: Probleme mit Timer und sleep
wenn du einen Sleep-Befehl aufrufst, dann bleibt er "genau" (über diese Bedeutung lässt sich bei Sleep gewaltig streiten) an dieser Postion stehen, d.h. es wird kein weiterer Befehl abgearbeitet - dein Programm steht KOMPLETT...
Daher nutze ich lieber ProcessMessages - ist etwas flexibler! |
Re: Probleme mit Timer und sleep
Die Befehle zwischen dem Sleep werden schon ausgeführt, allerdings bekommt das Programm keine Möglichkeit die Anzeige zu aktualisieren, also deine Änderungen zu zeichnen.
Dieses geschieht halt erst nach der Prozedur, oder halt in ProcessMessages, also da wo die WindowsMeldungen (wie z.B. der Befehl zum Neuzeichnen) abgearbeitet werden. |
Re: Probleme mit Timer und sleep
aso,
mein problem war nur, dass ich da interferenzen mit alten messwerten hatte, hab aber nun festgestellt, woran das lag, hab mein nicht lange genug auf meine meßwerte gewartet... aber application.processmessages macht das natürlich doch etwas schöner. wie schauts mit einer Antwort zu meiner zweiten frage aus, kann theoretisch der Timerinterrupt ausgelöst werden, wenn sich das Programm noch in der Prozedur OnTimer befindet? und zählt der Timer während sleep weiter? wahrscheinlich nicht, oder? Besten Dank, Martin |
Re: Probleme mit Timer und sleep
Der Timer hat keine Interrupts. Das funktioniert mit Nachrichten und während des Sleeps werden auch keine Nachrichten abgearbeitet.
|
Re: Probleme mit Timer und sleep
Zitat:
|
Re: Probleme mit Timer und sleep
Wenn du jetzt DELAY, oder ProcessMessages einbaust, dann könnten wärend des Laufs der TimerProzedur noch weidere Prozesse gestartet werden, also auch nochmal eine TimerProzedur, allerdings würde wärdend die nächste TimerProzedur läuft die erst angehalten, weil erst nach dem ender der letzten Prozedur das DELAY/ProcessMessages beendet wird.
Ohne DELAY, ProcessMessages und dergleichen würde die TimerProzedur nur einmal gestartet, weil die WindowsNachrichten ja erst danach abgearbeitet würden und demanch erst dann die nächste TimerProzedur gestartet werden könnte.s |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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