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');//wird nicht erreicht!
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