Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Alternative Sleep (https://www.delphipraxis.net/116302-alternative-sleep.html)

Buttercreme 26. Jun 2008 16:11


Alternative Sleep
 
Hallo Leute,

Ich habe ein Programm geschrieben welches öfters auf Tastenanschläge, Öffnen von anderen Programmen usw. warten muss. Am Anfang hatte ich viele Sleeps die ich nach und nach durch Timer ersetzt habe. Allerdings konnte ich das nicht überall einsetzen.

Jetzt passiert es das man Programm im Sleep ab und zu abstürzt. Blöd am Sleep ist auch das das Programm solange schläft.

Was ist eine gute alternative zu sleep?

sirius 26. Jun 2008 16:14

Re: Alternative Sleep
 
Kannst du bitte mal genauer erklären, wieso du auf Tastendrücke warten musst, und wieso du das Öffnen einer Datei mit sleep verzögern musst?

Buttercreme 26. Jun 2008 16:26

Re: Alternative Sleep
 
-> Java Applikation. Das Programm nimmt den Postmessage an, braucht aber eine gewisse Zeit um ihn durchzuführen. Und das gleiche bei dem Start der Java Applikation. Die Sandbox ist ist schon da (und damit das HWND) aber die Inhalte der Sandbox nicht.

Clemens L. 26. Jun 2008 16:36

Re: Alternative Sleep
 
So wie ich das verstanden habe willst du deine eigene Sleep-Funktion programmieren? Ich würds so machen:

Delphi-Quellcode:
procedure MySleep(milliseconds: Integer);
var a,b,c: int64;
begin
  QueryPerformanceFrequency(a);
  QueryPerformanceCounter(b);
  repeat
    Application.ProcessMessages;
    QueryPerformanceCounter(c);
  until milliseconds = (c - b) * 1000 div a;
  end;
end;
Edit: Ich sehe grade, das Programm darf nicht schlafen, ich weiss nicht ob da in "ProcessMessages" reicht!
Edit2: Code etwas verschönert

DeddyH 26. Jun 2008 16:42

Re: Alternative Sleep
 
Ich werfe mal Delay in den Raum.

Buttercreme 26. Jun 2008 16:46

Re: Alternative Sleep
 
@ Clemens

So etwas ähnliches habe ich bereits probiert. Allerdings fällt die Applikation dann auch in einen "Tiefschlaf".

Wie sieht das denn aus wenn man so etwas macht:

Delphi-Quellcode:
Timerxx.Enabled:=TRUE;
While Timerxx.Enabled = True do
begin

end;
Den Timer dann auf z.b. 1 Sekunde stellen und danach sich selber disablen lassen?

Ist so etwas "elegant" oder wie Sleep eher eine Funktion die die Applikation sperrt? Beim Sleep habe ich ja auch das Problem das wenn ich einen längeren Sleep habe ich auch den Rest den Programms nicht mehr bedienen lassen.

@DeddyH: wäre so etwas nicht dem ähnlich was Clemens probieren will? ICh hatte den Thread auch schon gefunden und aufprobiert. Aber trotzdem gibt es während des "Delay" einen Lag in der Applikation.

RavenIV 26. Jun 2008 16:49

Re: Alternative Sleep
 
Zitat:

Zitat von Buttercreme
Ich habe ein Programm geschrieben welches öfters auf Tastenanschläge, Öffnen von anderen Programmen usw. warten muss.

Auf irgendwas zu warten ist immer schlecht und das dann über sleep zu machen ist noch schlechter.
Sowas sollte man per Events steuern.
Für Tastendrücke kannst Du OnKeyDown oder OnKeyPress des Formulars verwenden.
Falls auch auf Tastendrück ausserhalb Deines Programmes reagiert werden soll, kannst Du einen Tastaturhook einbauen.
Mehr dazu findest Du mit der Forumssuche mit Stichwort "Hook".

Auf das Öffnen anderer Programme kann man bestimmt auch informiert werden.
Musst halt mal google bemühen.

Auf jeden Falls solltest Du das mit sleep und Timer nochmal überdenken.

Bernhard Geyer 26. Jun 2008 16:52

Re: Alternative Sleep
 
Zitat:

Zitat von Buttercreme
-> Java Applikation. Das Programm nimmt den Postmessage an, braucht aber eine gewisse Zeit um ihn durchzuführen. Und das gleiche bei dem Start der Java Applikation. Die Sandbox ist ist schon da (und damit das HWND) aber die Inhalte der Sandbox nicht.

ist es ein Java-Programm von euch? Dann würde ich das über JNI erledigen und "normal" mit den per JNI verfügbaren Klassen dieser Anwendung/JAR-Files machen.

Clemens L. 26. Jun 2008 17:07

Re: Alternative Sleep
 
Zitat:

Zitat von Buttercreme
@ Clemens

So etwas ähnliches habe ich bereits probiert. Allerdings fällt die Applikation dann auch in einen "Tiefschlaf".

Wie sieht das denn aus wenn man so etwas macht:

Delphi-Quellcode:
Timerxx.Enabled:=TRUE;
While Timerxx.Enabled = True do
begin

end;
Den Timer dann auf z.b. 1 Sekunde stellen und danach sich selber disablen lassen?

Ist so etwas "elegant" oder wie Sleep eher eine Funktion die die Applikation sperrt? Beim Sleep habe ich ja auch das Problem das wenn ich einen längeren Sleep habe ich auch den Rest den Programms nicht mehr bedienen lassen.

@DeddyH: wäre so etwas nicht dem ähnlich was Clemens probieren will? ICh hatte den Thread auch schon gefunden und aufprobiert. Aber trotzdem gibt es während des "Delay" einen Lag in der Applikation.

Bei deinem Vorschlag hängt der Thread aufjedenfall, da er auch in einer Schleife feststeckt! Das was DeddyH vorgeschlagen hat sieht für mich bis jetzt am besten aus (Delay revisited).

Edit: Ohne es getestet zu haben, aber ich glaube nicht das bei meinem Code der Prozess in einen Tiefschlaf fällt. :| Hast du es schon getestet?

RavenIV 26. Jun 2008 17:10

Re: Alternative Sleep
 
Zum Öffnen anderer Programme kannst Du mal hier lesen:
http://www.delphipraxis.net/internal...ct.php?t=99597

Hättest Du aber bestimmt auch über die Suche gefunden.
Stichwörter: "start nachricht"


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