Entwickler-Ecke
Windows API - Shellexecute and Wait
TNO - Mi 07.07.04 13:28
Titel: Shellexecute and Wait
Hallo zusammen,
also erstmal grosses Lob an alle, die an diesem Board beteiligt sind. Es ist wirklich sehr informativ. Weiter so !
Nun aber zu meinem Problem:
Also, ich schreibe gerade an einem Programm, in dem noch 1-2 weitere Programme benutzt werden.
Und ich möchte jetzt aus meinem Delphi Programm eins von den anderen starten lassen und auf das Ende des gestarteten Programms warten. Das ist ansich ja kein grosses Problem, funktioniert auch wunderbar mit "WaitForSingleObject".
Ich möchte aber nun, dass mein Hauptprogramm (welches ja auf das Ende des anderen Programms noch wartet) weitermacht und nicht einfriert. Das Hauptprogramm soll also nur nebenbei mitbekommen, dass das andere Programm fertig ist.
Als Lösung hab ich mir gedacht, einfach einen Thread für das "Shellexecute and Wait" zu erstellen, aber ich weiss nun nicht ob das damit sauber gelöst ist. Und auf was ich dabei auf jeden Fall achten muss ?
Oder hat sogar jemand eine einfachere bzw. bessere Idee ?
Für Lösungsvorschläge bin ich natürlich dankbar.
mfg
TNO
Delete - Mi 07.07.04 14:39
Wie wäre es mit Threads? Der Thread startet das Programm und wartet bis es zu Ende ist und benachrichtigt dann das Hauptfenster.
Talbot - Mi 07.07.04 15:00
Ich glaub ich hab eine Lösung für dein Problem. Vorrausgesetzt du startest keine Konsolenanwendungen.
Starte dein Programm mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin CreateProcess(nil, 'notepad',nil, nil, false, 0, nil, nil, StartInfo, ProzessInfo);
While WaitforInputIdle(ProzessInfo.hProcess, infinite) = 0 do begin Application.ProcessMessages; end; end; |
Dieser Code würde jetzt notepad starten (du kannst anstatt notepad dann deine Anwendungen starten) und sich dann in eine While-Schleife begeben die erst beendet wird wenn notepad wieder beendet wird.
Application.ProcessMessages; bewirkt lediglich das deine Parentanwendung noch bedienbar bleibt (falls du das wünscht).
StartInfo und Prozessinfo müssen zuvor deklariert werden:
Delphi-Quelltext
1: 2: 3:
| var StartInfo : _STARTUPINFOA; ProzessInfo : Process_Information; |
Vielleicht hat aber jemand hier in dem Forum wie man das gleiche mit Konsolenanwendungen hinkriegt?
In der msdn erklärung steht eindeutig das WaitforInputIdle nur mit GUI Prozessen funktioniert :( ich muss aber eine rar.exe ausführen...
Übrigens: Createprocess sucht nach den Anwendungen
1. im Verzeichnis aus der die Anwendung gestartet wurde
2. im Verzeichnis des "parent process"
3. im 32 Bit windows system Verzeichnis
4. im 16 Bit Windows system Verzeichnis
5. im Windows verzeichnis
6. in den globalen Pfaden
Moderiert von
Motzi: Code- durch Delphi-Tags ersetzt.
Talbot - Mi 07.07.04 15:07
...ich hätte mir deinen Thread mal besser durchlesen sollen bevor ich mich dumm und dämlich geschrieben hab :)
Naja, aber ich hab auch gleichzeitig deinen Thread beantwortet.
Du musst das ganze halt mit Application.Processmessages laufen lassen, dann bleibt deine Parent-Anwendung aktiv und bemerkt ganz nebenbei das die anderen Programme beendet wurden :)
TNO - Mi 07.07.04 15:10
@Talbot:
Es sind leider Konsolenprogramme und das Hauptprogramm von mir auch. Aber Danke für die Idee.
@Luckie:
Mit Threads wollte ich das auch machen. Habe mir dein (ziemlich gutes)Tutorial auch schon angschaut. Werde nach der Arbeit mich mal da dran setzen und den Thread fertig machen und hier posten, denn ich werde bestimmt noch 1-2 Fragen dazu haben.
mfg
TNO
MSCH - Mi 07.07.04 19:36
Einen oder mehrere Thread dafür zur nehmen scheint mir am sinnvollsten; allerdings musst du auf das synchronisieren der Main-Anwendung und den Treads achten. Ich meine, Beenden der Anwendung erst- wenn die Threads ihrerseits Ihr ok gegeben haben. Ansonsten gibts u.U. Datensalat.
grez
msch
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!