Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Timer und sleep (https://www.delphipraxis.net/69567-probleme-mit-timer-und-sleep.html)

happyaura 17. Mai 2006 09:04


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:
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;
dieser Programmcode hat zur folge, dass beide Labels gleichzeitig ihren Wert und ihre Farbe ändern, vermutet hätte ich aber eine reihenfolge wie:
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?

s.h.a.r.k 17. Mai 2006 09:10

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... (Hier im Forum suchenProcessMessages)

happyaura 17. Mai 2006 09:15

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

happyaura 17. Mai 2006 09:21

Re: Probleme mit Timer und sleep
 
habs gerade mal ausprobiert, ich denke, das wars. vielen Dank!

s.h.a.r.k 17. Mai 2006 09:24

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!

himitsu 17. Mai 2006 09:40

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.

happyaura 17. Mai 2006 09:46

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

Luckie 17. Mai 2006 09:47

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.

RavenIV 17. Mai 2006 09:50

Re: Probleme mit Timer und sleep
 
Zitat:

Zitat von happyaura
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.

das Stichwort für die Suche ist "delay".

himitsu 17. Mai 2006 10:00

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 05:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz