Autor Beitrag
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Di 21.06.11 14:44 
Servus !

Den nachfolgenden, gekürzten Programmausschnitt verwende ich, um zeitgesteuert etwas in Betrieb zu nehmen bzw. abzuschalten, wobei ich die Zeitsteuerung über TJvClock realisiere.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Adrian Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Adrian Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: 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