![]() |
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 ;) |
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
![]() |
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] |
Re: Programm hängt sich wegen SLEEP auf *HILFE*
|
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)? |
Re: Programm hängt sich wegen SLEEP auf *HILFE*
Zitat:
|
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.
|
Re: Programm hängt sich wegen SLEEP auf *HILFE*
Zitat:
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