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 |
Re: Warten bis ShellExecute fertig ist
Unter Umständen wäre WaitForSingleObject() etwas für dich
|
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) |
Re: Warten bis ShellExecute fertig ist
Ich würde lieber den Timeout INFINITE und ggf. MsgWaitForMultipleObjects nehmen. Polling ist böse.
|
Re: Warten bis ShellExecute fertig ist
Zitat:
Und wenn er so alle paar Sekunden mal nachsieht, ist das mit dem Polling nun auch nicht so schlimm. |
Re: Warten bis ShellExecute fertig ist
Will er währenddessen weiterarbeiten? :gruebel: Dann habe ich da etwas missverstanden.
|
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 |
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:
einfach
Repeat
Sleep(50); Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode); Until (ExitCode<>STILL_ACTIVE) Or Application.Terminated;
Delphi-Quellcode:
while not Application.Terminated and (MsgWaitForMultipleObjects(1, @SEInfo.hProcess, false, INFINITE, QS_ALLINPUT) = WAIT_OBJECT_0 + 1) do
Application.ProcessMessages; |
Re: Warten bis ShellExecute fertig ist
Zitat:
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.) |
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. |
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