Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - sleep-Befehl vorrangig?


Caesar44 - Di 17.06.08 21:00
Titel: sleep-Befehl vorrangig?
Hi an alle hier ,
ich bin hier neu im Forum und noch ziemlicher Anfänger in Delphi! Ich bin mir nicht ganz sicher, ob die Frage in diese Sparte des Forums passt, wenn nicht bitte verschiebn oder schließen :-).
Meine Frage bezieht sich auf die sleep-Funktion
Wenn ich folgenden Programmtext eingebe:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button3Click(Sender: TObject);
begin
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_Human.bmp');
  sleep(300);
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_PC.bmp');
end;

wird nicht, wie ich es wollte zuerst das eine Bild und dann nach 300 Millisekunden das andere Bild geladen, sondern 300 Millisekunden gewartet und dann das zweite Bild angezeigt.

Es Hat sich gleich noch ein zweites problem zu dem ersten hinzugesellt:
Ich kann mein Programm nicht starten, weil es sich nachdem ich f9 gedrückt habe sich sofort wieder in den Ausgangszustand zurückversetzt... :-(

Was mache ich falsch?
Hoffe ihr könnt mir helfen
Gruß Caesar44

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Xentar - Di 17.06.08 21:16

Für die zweite Frage machst du bitte ein neues Thema auf.

Zum ersten Problem:
Sleep sorgt dafür, dass die Anwendung komplett pausiert wird (Eigentlich nur der aktuelle Thread, in diesem Fall hast du aber nur einen, nämlich den Haupt-Thread).
Es wird zwar das erste Bild gesetzt - dadurch dass die Anwendung direkt danach aber "hängt" kommt das Programm aber nicht dazu, dieses Bild zu zeichnen / anzuzeigen.

Vorschlag: Benutz einen Timer (In der Komponentenpalette, zu finden unter System)
Anwendung: Stell den Timer auf 300. Wenn du auf den Button klickst, setzt du das erste Bild und startest den Timer. Wenn der Timer anschlägt (Event OnTimer) deaktivierst du ihn wieder, und setzt gleichzeitig das zweite Bild.


Caesar44 - Di 17.06.08 21:42

Vielen Dank für die Antwort,ich habe die Timerfunktion sofort ausprobiert! Allerdings ist bei mir, obwohl ich den Timerintervall immer gleich ist, die Zeit bis er das nächste Bild anzeigt unterschiedlich lang.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  image1.Picture.LoadfromFile ('J:\Eigene Bilder\Small_Human.bmp');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
image1.Picture.LoadfromFile ('J:\Eigene Bilder\Talk_Human.bmp');
Timer1.Enabled := True;

end;


ich mach wieder was falsch oder?
Gruß Caesar44


Xentar - Di 17.06.08 21:43

Du musst den Timer auch standardmäßig, also zur Entwurfszeit, deaktivieren.


Caesar44 - Di 17.06.08 21:55

user profile iconXentar hat folgendes geschrieben:
Du musst den Timer auch standardmäßig, also zur Entwurfszeit, deaktivieren.

Stimmt natürlich. Danke für die freundliche Hilfe Xentar, der Thread kann dann wohl als beantwortet gelten :D

Schönen Abend euch noch allen!
Caesar44


Yogu - Di 17.06.08 21:59
Titel: Re: sleep-Befehl vorrangig?
user profile iconCaesar44 hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button3Click(Sender: TObject);
begin
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_Human.bmp');
  sleep(300);
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_PC.bmp');
end;

Füge doch einfach einen Application.Processmessages ein. Dann hat Delphi auch Zeit, das erste Bild anzuzeigen :idea:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button3Click(Sender: TObject);
begin
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_Human.bmp');
  Application.ProcessMessages;
  sleep(300);
  Image1.picture.LoadFromFile ('J:\Eigene Bilder\Talk_PC.bmp');
end;

Aber natürlich ist ein Timer immer noch die bessere Wahl - da wird das Programm wenigstens nicht angehalten.