![]() |
Delay verhindert, dass Applikation geschlossen werden kann
'loha Folks,
Mit der folgenden Prozedur, wird eine Simulation unterbrochen...
Delphi-Quellcode:
...dieser Unterbruch wird so aufgerufen.
procedure TFDSC_Simulator.Delay(Milliseconds: Integer);
var Tick: DWord; Event: THandle; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWord(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin Application.ProcessMessages; Milliseconds := Tick - GetTickcount; end; finally CloseHandle(Event); end;
Delphi-Quellcode:
So weit so gut. Funktioniert...bis auf den Punkt, dass sich die Applikation nachher nicht mehr schliessen lässt.
while LCDanger = False do
begin Repeat Delay(1000) until LCDanger = True; Break; end; Des weiteren habe ich beobachtet, dass nach dem ersten Aufruf (Delay(1000)) jede Sekunde die obige Prozedur durchlaufen wird. Für Lösungsansätze wäre ich sehr dankbar. Grüsse hirnstoem |
Re: Delay verhindert, dass Applikation geschlossen werden ka
wird LCDanger auch wirklich true? Hatte gestern das selbe Problem, wo er nie aus der while schleife rausgekommen ist...
|
Re: Delay verhindert, dass Applikation geschlossen werden ka
ist es wirklich notwendig zwei schleifen zu verwenden? eine tuts doch auch.
außerdem wird ja die repeat - until schleife so schnell ausgeführt wie es geht. wenn dann ca jede millisekunde eine sekunde verzögert wir dann ist das auch nicht besonders gut für die performance. |
Re: Delay verhindert, dass Applikation geschlossen werden ka
LCDanger wird auf jeden Fall true, denn er macht ja genau das, was ich will...bis auf das Beenden.
Zwei Schleifen sind grundsätzlich nicht nötig, aber bei mir ist da noch einiges mehr an Code drin, welcher für dieses Problem aber nicht so wirklich relevant ist. |
Re: Delay verhindert, dass Applikation geschlossen werden ka
Hat sich erledigt, das Problem war, dass sich die Variable LCDanger teilweise zu schnell verändert hat, irgendwie....also mit einer Check Box (anstelle von LCDanger) funktioniert das ganze wider.
|
Re: Delay verhindert, dass Applikation geschlossen werden ka
Vorsicht !
Du musst sicherstellen das deine Funktion die Delay() aufruft, weil sie nicht reentrant ist, nicht mehrmals als Ergeinis eintreten kann. Delay() arbeitet quasi im Hintergrund alle Messages des Programmes ab, und dies sind zb. auch Messages das ein Button geklickt wurde. Hast du nun den Aufruf von Delay() in so einem Event drinnen dann wird diese Funktion quasi rekursiv über Messages aufgrufen. Probiers einfach aus
Delphi-Quellcode:
Das musst du verhindern mit zb.
procedure TForm1.Button1Click(Sender: TObject);
begin Delay(10000); ShowMessage('Test'); end;
Delphi-Quellcode:
wobei FAction: Integer ein Field des TForm1 ist.
procedure TForm1.Button1Click(Sender: TObject);
begin if FAction = 0 then try Inc(FAction); Button1.Caption := 'Stop'; while FAction = 1 do begin Delay(1000); MessagesBeep(0); end; finally FAction := 0; Button1.Caption := 'Start'; end else Inc(FAction); end; Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 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