Programm X soll warten bis ein Programm Y gestartet ist

Aschibesche

Grünschnabel
Guten Abend,
ich benötige eure Hilfe.
Und zwar starte ich Programm X.
Programm X soll dann auf Programm Y warten.
Wenn das Programm Y dann geöffnet wurde soll Programm X weiter machen.

Kann mir da jemand einen Code geben?
Tut mir leid bin ein Noob. Hab es mit FindWindow versucht bin aber nicht weiter gekommen.

Ich danke schonmal im Vorraus.

MfG,
Aschibesche
 

Technipion

Erfahrenes Mitglied
Hallo Aschibesche,
kannst du vielleicht noch etwas konkreter werden was Programm X/Y sind, und was genau sie tun?

Für das von dir beschriebene Verhalten gibt es mehrere mögliche Ansätze. Ein sehr einfacher Weg ist z.B.:
- Programm Y legt beim Starten grundsätzlich eine Sperrdatei (Lock) in einem temporären Verzeichnis an
- Programm X kann nun in bestimmten Intervallen überprüfen, ob eine Lock angelegt wurde und darauf reagieren

Gruß Technipion
 

Endurion

Erfahrenes Mitglied
Es gibt unterschiedliche Ansätze, je nachdem, ob du Zugriff auf den Code von Programm Y hast und es ändern kannst.

Wenn ja, dann so etwas, wie Technipion beschreibt. Ein Lock-File würde ich aber grundsätzlich nie benutzen (die sind sehr ärgerlich, wenn ein Programm abschmiert). Du könntest ein Mutex setzen, und im aufrufenden Programm prüfen, ob das Mutex schon existiert.

Sonst wäre der übliche Weg mit CreateProcess gefolgt von WaitForInputIdle. Letzteres wartet, bis der übergebene Prozess aufnahmebereit für Eingaben ist, das scheint am zielführendsten zu sein.

Denk dran, die beiden HANDLEs, die in PROCESS_INFORMATION zurückgegeben werden, müssen per CloseHandle zugemacht werden. Die CloseHandle-Aufrufe beenden nicht den aufgerufenen Prozess, sie geben nur System-Resourcen frei.
 

cwriter

Erfahrenes Mitglied
Kann mir da jemand einen Code geben?
Hehe... Das ist nicht so einfach, wenn wir die Anforderungen nicht genau kennen.

Für das von dir beschriebene Verhalten gibt es mehrere mögliche Ansätze. Ein sehr einfacher Weg ist z.B.:
- Programm Y legt beim Starten grundsätzlich eine Sperrdatei (Lock) in einem temporären Verzeichnis an
- Programm X kann nun in bestimmten Intervallen überprüfen, ob eine Lock angelegt wurde und darauf reagieren
Das geht natürlich (und Linux macht das viel zu gerne), hat aber 2 entscheidende Nachteile:
Ein Lock-File würde ich aber grundsätzlich nie benutzen (die sind sehr ärgerlich, wenn ein Programm abschmiert).
und
Es gibt unterschiedliche Ansätze, je nachdem, ob du Zugriff auf den Code von Programm Y hast und es ändern kannst.
Das sind alles Bastellösungen (was, wenn man das andere Programm ohne Lockfile haben will? Einen Parameter hinzufügen? Dann muss man das Programm auch programmatisch starten.)

Sonst wäre der übliche Weg mit CreateProcess gefolgt von WaitForInputIdle.
Das gilt natürlich nur, wenn man das Programm selbst starten kann. (Z.B. als interaktives Tutorial, "Öffnen Sie jetzt den Webbrowser", geht das nicht).

FindWindow versucht bin aber nicht weiter gekommen.
Das FindWindow ist von daher auch nicht schlecht, hat aber Probleme, wenn der Titel/ClassName sich ändert.

Kann mir da jemand einen Code geben?
Tut mir leid bin ein Noob. Hab es mit FindWindow versucht bin aber nicht weiter gekommen.
Was hast du denn bis jetzt? Code?

Gruss
cwriter
 

Aschibesche

Grünschnabel
Alles klar, also:
Programm X (mein Programm) starte ich.
Programm X macht dann Action 1.
Programm X soll jetzt SOLANGE warten bis Programm Y (nicht mein Programm) gestartet wurde.
Wenn Programm Y dann gestartet wurde, soll Programm X Action 2 machen bzw einfach weiter machen.

Der Titel von Programm Y ändert sich nicht. Also kann ruhig zb. Notepad.exe angegeben werden.

Ich brauche nur diese "Warte auf Notepad.exe funktion".
 

vfl_freak

Premium-User
Moin,

nun ja, das ist nur eine Wiederholung der Aufgabenstellung ... :rolleyes:
Die Frage galt Deinen bisherigen Code-Ansatz !

VG Klaus
 

cwriter

Erfahrenes Mitglied
naja die warte funktion sollte in
int main
{
}
passieren
Soso.

nun ja, das ist nur eine Wiederholung der Aufgabenstellung ... :rolleyes:
Das ist durchaus eine korrekte Feststellung und verdient keine patzige Antwort.

Du hast mit
Wenn Programm Y dann gestartet wurde, soll Programm X Action 2 machen bzw einfach weiter machen.
nicht beantwortet, ob das Programm X vom Programm Y gestartet wird oder nicht. Ist das der Fall, bietet sich die Antwort von @Endurion an; sie ist besser als die Alternative:
Sonst wäre der übliche Weg mit CreateProcess gefolgt von WaitForInputIdle

Falls das Programm X unabhängig davon gestartet werden soll (also Programm Y den Process Handle nicht direkt hat), dann kannst du auch mit dem von dir schon angesprochenen FindWindow
Hab es mit FindWindow versucht bin aber nicht weiter gekommen.
machen, dabei solltest du aber beachten, dass das nicht unbedingt zukunftssicher ist.
Der Titel von Programm Y ändert sich nicht. Also kann ruhig zb. Notepad.exe angegeben werden.
Und wenn es ein Update gibt, das den Titel/die Klasse verändert?

Falls du ein spezifisches Programm überprüfen willst, dann geht es auch über den Prozessnamen (auch das ist wie FindWindow() recht ungenau): https://stackoverflow.com/questions/865152/how-can-i-get-a-process-handle-by-its-name-in-c

Aber alleine schon
Kann mir da jemand einen Code geben?
und
Ich brauche nur diese "Warte auf Notepad.exe funktion".
und
naja die warte funktion sollte in
int main
{
}
passieren
sagt eigentlich genug aus:
Du willst einen fertigen Code bekommen, also quasi eine Gratisleistung beziehen. Wir helfen auch gerne, aber wir machen dir nicht deine Arbeit.
Wenn es dir zu viel ist, auf nett gemeinte Rückfragen wie
Was hast du denn bis jetzt? Code?
zu reagieren und etwas abzuliefern, bei dem wir beim Code helfen können, dann bist du hier wohl eher falsch.

Dazu auch:
https://www.tutorials.de/help/netiquette/

Solltest du dich dazu bequemen, dich an die Netiquette zu halten, dann können solche "Fragen" (die eher Aufträge sind), gerne hier gepostet werden: https://www.tutorials.de/forums/jobboerse-jobs-tutorials-de.312/

Möglicherweise habe ich einen schlechten Tag, möglicherweise sehen das die anderen Forenmitglieder anders (wobei diese gerne ihren Unmut zu meinem Pamphlet zum Ausdruck bringen mögen), aber vor allem dein letzter Post kam bei mir ganz schlecht an.
Ich bin nicht nachtragend und helfe dir auch gerne, solltest du ein bisschen mithelfen, aber diese Erwartungshaltung geht mir auf den Zeiger.

Gruss
cwriter
 

jkallup

Erfahrenes Mitglied
hi,

unter windows:

1. Programm X starten
2. Programm X ruft DLL helper Programm Y auf (DllMain)
3. DLL Pointer nicht als Heap
4. DLL als Hook registrieren

dann sollstts klappen ä:)