Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TJvClock bleibt stehen
Adrian - Di 21.06.11 14:44
Titel: TJvClock bleibt stehen
Servus !
Den nachfolgenden, gekürzten Programmausschnitt verwende ich, um zeitgesteuert etwas in Betrieb zu nehmen bzw. abzuschalten, wobei ich die Zeitsteuerung über TJvClock realisiere.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure Delay(ms : DWord); var TheTime : DWord; begin TheTime := GetTickCount + ms; while GetTickCount < TheTime do Application.ProcessMessages; end;
procedure TForm1.JvClock1Alarm(Sender: TObject); begin MessageMemo.Lines.Add('Alarm ausgelöst!'); if odd(JvClock1.Tag) then Ausschalten else Einschalten; end;
procedure TForm1.Einschalten; begin MessageMemo.Lines.Add('30 Sek. warten'); Delay(30000); MessageMemo.Lines.Add('Test beginnen'); StartClick(nil); MessageMemo.Lines.Add('Fertig, auf nächste Aktion warten');end;
procedure TForm1.Ausschalten; begin MessageMemo.Lines.Add('Test beenden'); StopClick(nil); MessageMemo.Lines.Add('30 Sek. warten'); Delay(30000); MessageMemo.Lines.Add('Fertig, auf nächste Aktion warten'); end; |
Unglücklicherweise bleibt die Uhr nicht nur während der Delay-Pause stehen, nein, auch wenn der mit StartClick in Gang gesetzte Programmteil läuft, wird die Uhrzeit nicht weiter gezählt. Das hat zur Folge, daß der Programmteil, der eigentlich über StopClick angehalten würde, immer weiter läuft.
Ist das nun ein normales Verhalten von TJvClock, oder muß ich hier etwas extra einstellen?
Gruß,
Adrian
Nersgatt - Di 21.06.11 15:56
Während die Prozedur StartClick ausgeführt wird ist der Hauptthread damit beschäftigt. Und kann dann natürlich nichts andere ausführen.
Schmutzige Lösung: in StartClick großzügig Application.ProcessMessages verteilen.
Saubere Lösung: StartClick in einen Thread auslagern.
Adrian - Di 21.06.11 16:31
Servus Nersgatt!
Die "schmutzige" Lösung bringt wohl keinen Erfolg. Schau dir mal die Delay-Prozedur an, viel mehr Application.ProcessMessages kann man da kaum reinpacken. Trotzdem bleibt auch schon hier die Uhr stehen. Deshalb meine ich, daß das Problem irgendwo anders liegt.
Gruß,
Adrian
jasocul - Di 21.06.11 16:57
Vermutlich benutzen deine Routinen gar nicht deine Delay-Prozedur, sondern die, die in Delphi implementiert ist. Dort gibt es auch kein Application.ProcessMessages.
Gib deiner Prozedur mal einen anderen Namen.
Nersgatt - Di 21.06.11 18:44
Oh, jetzt fällt mir auch auf. Du hast eine eigene Delayprozedur geschrieben. :?
So treibt man Kollegen in den Wahnsinn. :D
Adrian - Fr 24.06.11 23:05
Servus!
Ja klar, ich verwende meine eigene Delay-Routine. Ein Umbenennen bringt nichts (kennt Delphi mittlerweile den alten Pascal-Befehl?)
Das Problem habe ich so gelöst, daß ich den TTimer verwende. JvClock hat nun nur noch die Funktionen die Zeit anzuzeigen und via Farbwechsel den aktuellen Prüfstatus zu signalisieren.
Gruß,
Adrian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!