Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm hängt sich wegen SLEEP auf *HILFE* (https://www.delphipraxis.net/44304-programm-haengt-sich-wegen-sleep-auf-%2Ahilfe%2A.html)

Günni 17. Apr 2005 13:11


Programm hängt sich wegen SLEEP auf *HILFE*
 
Folgender Sachverhalt:


Ich habe eine Gifanimation die ich mittels mausklick gerne bewegen will. Da hab ich als erstes das hier gemacht:
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
xm := X;
ym := Y;
end;

procedure TForm1.FormClick(Sender: TObject);
begin

if ym > JvGifAnimator1.Top then
begin
while ym > JvGifAnimator1.Top do
begin
JvGifAnimator1.Top :=JvGifAnimator1.Top +1;
end
end
else
begin
while ym < JvGifAnimator1.Top do
JvGifAnimator1.Top :=JvGifAnimator1.Top -1;
end;
if xm > JvGifAnimator1.Left then
begin
while xm > JvGifAnimator1.Left do
JvGifAnimator1.Left :=JvGifAnimator1.Left +1
end
else
begin
while xm < JvGifAnimator1.Left do
JvGifAnimator1.Left :=JvGifAnimator1.Lft -1;
end
  end;



n bisschen viele begins und ends ich weiss ja aber es funktioniert.Nur leider etwas zu schnell so dass gar keine Bewegung zu stande kommt, sondern die Animation sofort beim Mauszeiger landet dann hab ich einfach for jedes JvGifAnimator1.Left :=JvGifAnimator1.Left +1 und so weiter ein SLEEP(1) gesetzt und nun hängt es sich komplett auf und nichts geht mehr. Warum??? kennt jemand vielleicht eine Lösung oder weiss zumindest warum das dann hängt...ic hversteh es nicht.

Danke schonmal im Vorrausich bin mir sicher jemand kann mir helfen ;)

Luckie 17. Apr 2005 13:14

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Sleep legt den ganzen Thread lahm, da es die verbleibende Rechnzeit an andere Prozesse abgibt. Probier mal Hier im Forum suchenDelay.

Uncle Cracker 17. Apr 2005 13:19

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Mit der Funktion Sleep wird die Ausführung des aktuellen Threades unterbrochen. Wird Sleep im Hauptthread der Anwendung aufgerufen, so befindet sich die gesamte Anwendung anschließend im Ruhezustand und es werden in diesem Zeitraum weder Nachrichten noch Befehle abgearbeitet.
Das bedeutet, dass die gesamte Anwendung still steht und nicht mehr reagiert.

Um jetzt nicht das gesamte Programm zum stillstand zu bringen, sondern das Programm wie in einer Schleife laufen zulassen, nimmt man ProcessMessage. In Pascal gab es die Funktion Delay...

Delphi-Quellcode:
procedure Delay(const Milliseconds: DWord);
var Start: Integer;
begin
  Start:=GetTickCount;
  while GetTickCount-Start <= Milliseconds do
    application.ProcessMessages;
end;

[Edit]Hätte mir doch ni soviel Zeit lassen sollen, dann wäre ich erster... :zwinker: [/Edit]

Speedmaster 17. Apr 2005 13:37

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Wie wärs mit Code einrücken und ordenlich Formatieren....
Guckst du hier!

FAlter 17. Apr 2005 15:15

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Delay würde ich persönlich in diesem Fall nicht empfehlen, da dann deine Prozessorauslastung extrem stark ansteigt...

Statdessen rufe Application.ProcessMessages direkt nach deinem Sleep auf. Alternativ könntest du natürlich einen Extra-Thread erstellen, aber ob sich das lohnt (Frage Aufwand <-> Nutzen)?

Speedmaster 17. Apr 2005 15:26

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Zitat:

Zitat von FAlter
Delay würde ich persönlich in diesem Fall nicht empfehlen, da dann deine Prozessorauslastung extrem stark ansteigt...

Statdessen rufe Application.ProcessMessages direkt nach deinem Sleep auf. Alternativ könntest du natürlich einen Extra-Thread erstellen, aber ob sich das lohnt (Frage Aufwand <-> Nutzen)?

ProcessMessage nach Sleep aufrufen?? Sry aber ich dachte das Programm "schläft", d.h. es wird auch nix weitergemacht!

SirThornberry 17. Apr 2005 15:30

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
die reihenfolge sollte man vielleicht wirklich überdenken das wenigstens erst die änderungen optich dargestellt werden (wie repaints etc.) und danach erst das sleep.

FAlter 17. Apr 2005 15:36

Re: Programm hängt sich wegen SLEEP auf *HILFE*
 
Zitat:

ProcessMessage nach Sleep aufrufen?? Sry aber ich dachte das Programm "schläft", d.h. es wird auch nix weitergemacht!
Nun ja, die Messages stehen somit immer noch in der "Warteschleife" (nicht wörtlich nehmen!), da eben NICHTS getan wurde.

Der Benutzer merkt keinen Unterschied, ob das Sleep vor oder nach dem Abarbeiten der Messages passiert, wenn die Sleep-Zeiten kurz genug sind.

Bei längeren Zeiten oder beim Supermenschen wäre es aber tatsächlich besser, erst ein Application.ProcessMessages und dann sleep aufzurufen, wie der Sir vorschlägt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 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