Autor Beitrag
TNO
Hält's aus hier
Beiträge: 2

RedHat 9, WIN 2000, WIN XP
Delphi 6
BeitragVerfasst: Mi 07.07.04 13:28 
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

_________________
Ich würde ja gerne die Welt verändern, aber Gott will mir einfach nicht den Quelltext geben !
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  CreateProcess(nil'notepad',nil,
                nil, false, 0nilnil, StartInfo, ProzessInfo);

  While WaitforInputIdle(ProzessInfo.hProcess, infinite) = 0 do begin
    Application.ProcessMessages; //optional
  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:
ausblenden 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 user profile iconMotzi: Code- durch Delphi-Tags ersetzt.
Talbot
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Win 2000, Win98, WinXP Prof, Linux(Suse, Gentoo, Debian, RedHat)
D6 Enterprise
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2

RedHat 9, WIN 2000, WIN XP
Delphi 6
BeitragVerfasst: 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

_________________
Ich würde ja gerne die Welt verändern, aber Gott will mir einfach nicht den Quelltext geben !
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?