Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Alternative zu Sleep


n-regen - Mo 24.07.06 17:00
Titel: Alternative zu Sleep
Hallo!
Gibt es in Delphi eine Möglichkeit, wie man eine bestimmte Zeitspanne warten kann, ohne das Programm währenddessen zu freezen?


Fighter#1 - Mo 24.07.06 17:03

es gibt natürlich noch den Timer, aber der is eher nicht so genau.


n-regen - Mo 24.07.06 17:08

Das is das Problem:
ich will das in den quelltext:

Delphi-Quelltext
1:
2:
3:
blablabla
warte(1000)
laberlaber


Grendel - Mo 24.07.06 17:27

user profile iconn-regen hat folgendes geschrieben:
[...] warten kann, ohne [...] freezen?

Nein, denn entweder wartet dein Programm, oder es "freezed" (manmanman...) nicht.
Du hast zwei Möglichkeiten. Entweder du arbeitest mit Threads oder aber einem solchen Konstrukt (ungestestet):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Warte(AMilliSeconds: Integer);
var
  i: Integer;
begin
  while i < AMilliSeconds do
  begin
    sleep(100);
    Application.ProcessMessages();
    Inc(i, 100);
  end;
end;


Allerdings werden während dieses "Wartens" (genauer bei Application.ProcessMessages()) auch Benutzereingaben (Klick auf Abbrechen, Schließen, etc.) verarbeitet.

Bis neulich ...


n-regen - Mo 24.07.06 17:31

Hurra!
Das ist genau das, was ich brauche: das Programm arbeitet beim Warten weiter.


Fighter#1 - Mo 24.07.06 18:17

Wobei nachher die Zeit auch nicht ganz stimmt.


n-regen - Di 25.07.06 09:33

Es geht ja bloß um Sekunden - keine Milli-Sekunden!


Gausi - Di 25.07.06 09:47

Ich denke, das hilft weiter:

http://www.delphi-library.de/topic_Delay+resourcenschonender_23225.html


n-regen - Di 25.07.06 09:56

Ich habs doch schon:

user profile iconGrendel hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure Warte(AMilliSeconds: Integer);
var
  i: Integer;
begin
  while i < AMilliSeconds do
  begin
    sleep(100);
    Application.ProcessMessages();
    Inc(i, 100);
  end;
end;



Born-to-Frag - Di 25.07.06 10:20

Warum soll Sleep genauer als ein Timer sein? Ein Timer wäre doch genau das richtige oder eben ein Thread...
EDIT: Ach du benutzt ja immer noch Sleep.. naja alle 100ms Application.ProcessMessages ist ja auch nicht das wahre


greetz


Motzi - Di 25.07.06 10:57

user profile iconn-regen hat folgendes geschrieben:
Ich habs doch schon

Ja, aber das was du hier machst ist ein so genanntes "Polling". Du fragst in einer Schleife immer wieder eine bestimmte Bedingung ab, und machst in der Zwischenzeit nichts anderes als darauf zu warten, dass diese auftritt (und fragst weiter ab). Dies belastet die CPU ganz schön (auch wenn das in deinem Fall durch das sleep halbwegs relativiert wird).
In dem Link den Gausi schon gepostet hat (http://www.delphi-library.de/topic_Delay+resourcenschonender_23225.html) zeig ich eine Methode die dasselbe macht wie deine, dabei aber wesentlich resourcenschonender ist...

Gruß, Motzi