Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Warten bis ShellExecute fertig ist (https://www.delphipraxis.net/138835-warten-bis-shellexecute-fertig-ist.html)

Larsi 18. Aug 2009 11:08


Warten bis ShellExecute fertig ist
 
Hi,

ich konvetiere eine Wav Datei in eine Mp3 Datei. Lame rufe ich dafür per Shellexecute auf. Nach dieser Konvetierung möchte ich die Wav Datei löschen, was aber erst geht wenn die Konvetierung in der Komandozeiler fertig ist. Wie kann ich das realisieren? Die Anwendung darf nach der Konvetierung aber nicht warten bis die Datei gelöscht ist sondern muss gleich eine neue Wav Datei erstellen während die Datei gelöscht wird.

MFG Lars Wiltfang

mkinzler 18. Aug 2009 11:10

Re: Warten bis ShellExecute fertig ist
 
Unter Umständen wäre WaitForSingleObject() etwas für dich

himitsu 18. Aug 2009 11:16

Re: Warten bis ShellExecute fertig ist
 
jupp, ShellExecuteEx verwenden, das Handle vom LAME merken

und dann abundzu mal nachsehn, ob dieses Handle, bzw. die zugehörige Anwendung noch aktiv ist.
(z.B. mit WaitForSingleObject, einem kurzen TimeOut und den Rückgabewert prüfen)

Apollonius 18. Aug 2009 11:21

Re: Warten bis ShellExecute fertig ist
 
Ich würde lieber den Timeout INFINITE und ggf. MsgWaitForMultipleObjects nehmen. Polling ist böse.

himitsu 18. Aug 2009 11:25

Re: Warten bis ShellExecute fertig ist
 
Zitat:

Zitat von Apollonius
Ich würde lieber den Timeout INFINITE und ggf. MsgWaitForMultipleObjects nehmen. Polling ist böse.

dann müßte er es aber auch in einen Thread auslagern, da er wärenddessen ja weiterarbeiten will :zwinker:

Und wenn er so alle paar Sekunden mal nachsieht, ist das mit dem Polling nun auch nicht so schlimm.

Apollonius 18. Aug 2009 11:29

Re: Warten bis ShellExecute fertig ist
 
Will er währenddessen weiterarbeiten? :gruebel: Dann habe ich da etwas missverstanden.

Schwedenbitter 18. Aug 2009 11:36

Re: Warten bis ShellExecute fertig ist
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Anhang!

Hier wird es auch mit Polling gemacht. Bei mir geht aber die CPU-Last selbst bei einem "alten" 800 MHz PIII nicht über 0% im Taskmanager.

Gruß, Alex

Apollonius 18. Aug 2009 11:45

Re: Warten bis ShellExecute fertig ist
 
CPU-Last ist nicht der einzige Grund, Polling zu vermeiden. Durch Polling kann Windows deinen Programmcode nicht in die Auslagerungsdatei schieben, da er immer wieder benötigt wird. Die Alternativlösung ist auch nicht komplizierter.
Statt
Delphi-Quellcode:
Repeat
    Sleep(50);
    Application.ProcessMessages;
    GetExitCodeProcess(SEInfo.hProcess, ExitCode);
Until (ExitCode<>STILL_ACTIVE) Or Application.Terminated;
einfach
Delphi-Quellcode:
while not Application.Terminated and (MsgWaitForMultipleObjects(1, @SEInfo.hProcess, false, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1) do
     Application.ProcessMessages;

himitsu 18. Aug 2009 11:53

Re: Warten bis ShellExecute fertig ist
 
Zitat:

Zitat von Schwedenbitter
Hier wird es auch mit Polling gemacht.

jupp, das liegt am Sleep (oder wenn man eben nebenbei noch Aderes macht).

ohne das Sleep würde ständig Application.ProgressMessages ausgeführt und die CPU-Last gegen 100% wandern.


Aber wie gesagt, entweder es lagert es in einen Thread aus, wartet dort mit INFINITE und braucht keine Schleife mehr,
oder er pollt zwischendurch immer mal wieder ...
z.B. könnte er ja schauen, ob die anderen Prozesse fertig sind, nachdem er jeweils eine Datei fertig erstellt hat.
(und da er sein programm ja eh am arbeiten ist, isses nun auch nicht so schlimm, wenn dieses nicht ausgelagert würde.)

Sharky 18. Aug 2009 11:54

Re: Warten bis ShellExecute fertig ist
 
Da gibt es auch etwas in der Code-Library


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz