Entwickler-Ecke

Windows API - Programm anhalten (einfrieren)


Holg_i - Mi 08.05.13 16:46
Titel: Programm anhalten (einfrieren)
Hallo an alle,

ich möchte folgendes realisieren:

Mein Programm läuft ganz normal ab. Sollte ich ein Formular (ShowModal) so muss der Anwender ja erst das Formular beenden bevor er mit dem Programm weiter arbeiten kann. Doch ich möchte das Programm auch auf keine Ereignisse mehr reagiert (OnTimer und Co).

In meinem Programm sprechen sehr viele Routinen auf Ereignisse an. Mehre Timer, RS232 eingäng, TCP/IP u.s.w

Ich stelle mir das so wie beim Debug vor wenn ich ein Brakpoint setze.

Hätte Ihr ein Lösungsansatz für D7?


ChrisCross - Mi 08.05.13 18:51

Hallo Holg_i,

versuche einfach einmal sleep. Dahinter muss die Sekundenanzahl. Vielleicht könnte man da auch einfügen, bis das Formular beendet warten.


Delete - Mi 08.05.13 19:59

Besser als die SLEEP-Function ist die SetWaitableTimer-Function.

Ein SLEEP-Ersatz besteht aus:
- CreateWaitableTimer
- SetWaitableTimer
- WaitForSingleObject (z.B. modales Fenster wird geschlossen)

Test: Button1 klicken, gleich anschliessend Button2 klicken
Obwohl Timer1 unter Button1Click nur 10 Sek. läuft, wird erst nach Ablauf von Timer2 das Ende von Timer1 angezeigt.


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:
33:
procedure TForm1.Button1Click(Sender: TObject); // Timer1
var
AlarmTimer : THandle;
Zeit : Large_Integer;
begin
Label1.Caption:='Running...';
AlarmTimer := CreateWaitableTimer(nil, False, nil);
CancelWaitableTimer(AlarmTimer);
Zeit.QuadPart := 10 * (-10000000); // 10 Sekunden-Test
SetWaitableTimer(AlarmTimer, Zeit.Quadpart, 0nilnil, False);
while WaitForSingleObject(AlarmTimer, 20) <> Wait_Object_0 do // Beispiel: 20msec
begin
  Application.ProcessMessages;
end;
Label1.Caption:='Ready';
end;

procedure TForm1.Button2Click(Sender: TObject); // Timer2
var
AlarmTimer : THandle;
Zeit : Large_Integer;
begin
Label2.Caption:='Running...'; Application.ProcessMessages;
AlarmTimer := CreateWaitableTimer(nil, False, nil);
CancelWaitableTimer(AlarmTimer);
Zeit.QuadPart := 30 * (-10000000); // 30 Sekunden-Test
SetWaitableTimer(AlarmTimer, Zeit.Quadpart, 0nilnil, False);
while WaitForSingleObject(AlarmTimer, INFINITE) <> Wait_Object_0 do
begin
  Application.ProcessMessages; // ACHTUNG - Programm tut NICHTS!!!
end;
Label2.Caption:='Ready';
end;


IhopeonlyReader - Mi 08.05.13 20:20

user profile iconChrisCross hat folgendes geschrieben Zum zitierten Posting springen:
sleep. Dahinter muss die Sekundenanzahl

Millisekunden ;)

Delphi-Quelltext
1:
sleep(1000); //1 sek "sleepen"                    


ChrisCross - Do 09.05.13 12:24

:oops: stimmt