[Delphi7] Schleife mit sleep() hängt

Hallo allerseits!
Ich habe in Delphi7 ein Programm programmiert, das etwas berechnet und diesen Rechenvorgang alle 2 Sekunden wiederholt.
Das habe ich so realisiert:

procedure allesmacher(…)
begin
while not application.terminated do
begin;
rechnen; //Berechnungs-Prozedur
sleep(2000); //Eben warten…
end;
end;

Aber wenn ich das jetzt ausführe, geht alles, wird auch immer aktuell angezeigt, aber alles andere an dem Programmfenster reagiert nichtmehr.
Warum??

Danke im Voraus…
Maik

Hallo,

Aber wenn ich das jetzt ausführe, geht alles, wird auch immer
aktuell angezeigt,

das wundert mich.

aber alles andere an dem Programmfenster
reagiert nichtmehr.
Warum??

weil das Programm den Benachrichtigungs-Stack erst nach Ende der Prozedur wieder abfragt. Ein solches gibt es bei dir aber nicht. Du musst also entweder mit mehreren Threads arbeiten oder in der Schleife ein „Application.ProcessMessages()“ einfügen. Bei letzterem kannst du aber keinen zusätzlichen Code parallel ausführen. Statt der Sleep-Funktion würde ich ohnehin eher einen Timer einsetzen.

Gruß, Niels

…entweder mit mehreren Threads arbeiten…

Wie geht das mit den Threads?? (Bin neu in Delphi…)

oder in der Schleife ein „Application.ProcessMessages()“

Wäre für meinen Fall das Beste,l aber geht dann auch kein Code mehr, der von Buttons ausgeht?? eWeil mehr mhr muss das Programm parallelnicht können.

mfg Maik

Hallo,

Entweder du arbeitest mit einem Thread (siehe TThread in der online-Hilfe) oder Du mußt regelmäßig die Windows-Botschaftsbearbeitung laufen lassen.

Minimal-Code für den Thread:

Type
 TRechnenThread = class(TThread)
 procedure Execute; override;
 end;
...
procedure TRechnenThread.Execute; 
begin
 rechnen;
end;
...
var
 RechnenThread = TRechnenThread;
begin
 RechnenThread = TRechnenThread.Create(false);
 ...
end;

RechnenThread

Minimal-Code für die Botschaftsbearbeitung:

procedure allesmacher(...)
begin
 while not application.terminated do
 begin
 rechnen;
 Application.ProcessMessages;
 end; 
end;

Warum wartest Du eigentlich („sleep(2000)“) ?

LG
Jochen

Hi!

Warum wartest Du eigentlich („sleep(2000)“) ?

hm… jetzt wo du’s sagst… kein Plan, das war noch von bevor ich wusste, was ich programmiere…
aber ich habe das problem jetzt ohne threads gelöst.
mfg maik

Hey,
ich würde auch empfehlen einen Timer zu benutzen. Ansonsten würde ich noch ein Form1.Repaint und/oder Form1.Refresh einbauen.

Schöne Grüße aus Ober-Beerbach,
Florian