WaitForSingleObject bringt es nicht
-
Das Funktioniert doch aber nur wenn ich selber die Programme geschreiben habe. das ist hier aber nicht der Fall. Auch wenn euch die Programme sicher nichts sagen schreibe ich sie mal.
Gestartet werden unter anderem TestStand, LaserVision,DHCP-Server,... und einige mehr. Da ich diese nicht geschriben habe kann ich mich nur auf standart routinen verlassen.
Beim dem IPC verstehe ich das so das beide Programme mit den Befehlen etwas anfangen können müssen bzw drauf reagieren. Ist das in diesem fall auch sicher gestellt??
-
Hast Du Dir mal WaitForInputIdle angesehen?
-
Grüße,
ja das habe ich auch schon versucht. Bringt auch nicht die Lösung die ich brauche. Um ehrlich zu sein finde ich überhaupt keinen unterschied zwischen WaitForSingleObject und WaitForInputIdle. Beide befehle warten entweder eine bestimmte Zeit oder bis das Programm beendet wurde. Da Programm B aber Programm A benötigt kann ich nicht warten bis A beendet wurde. Die Steuerung über Zeit geht auch nicht da jeder Rechner unterschiedlich schnell ist und es für die Zukunft nicht abzusehen ist welche Programme noch betroffen sind. Es kann immer noch ein Programm C u/o D dazukommen die wieder andere Startzeiten haben. Also müsste ich echt wissen wann das Programm fertig geladen ist Nur wie geht das?Danke.

-
Hast Du es schon versucht mit der Funktion? Ich würde es mal ausprobieren. Laut MSDN (siehe Link oben) sollte es genau für Dein Problem zutreffen.
Remarks
The WaitForInputIdle function enables a thread to suspend its execution until the specified process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronizing a parent process and a newly created child process. When a parent process creates a child process, the CreateProcess function returns without waiting for the child process to finish its initialization. Before trying to communicate with the child process, the parent process can use WaitForInputIdle to determine when the child's initialization has been completed. For example, the parent process should use WaitForInputIdle before trying to find a window associated with the child process.The WaitForInputIdle function can be used at any time, not just during application startup.
-
Grüße,
Also ich hatte WaitForInputIdle schon einmal getestet und habe es gerade noch wieder holt. Der Befehl wird übersprungen schon bevor überhaupt etwas vom Programm zu sehen ist. Ich weis nicht wo dran hier die Init. Festgemacht wird.
Bei dem einen Programm kommt ein Fenster wo die Hardware Init wird. Schon diesen Punkt nimmt WaitForInputIdle um in meinem Programm fortzufahren. Da dauert es aber noch min 30 sec. Bis das Programm geladen ist. Beim 2. Programm ist noch nicht mal ein Fenster zusehen aber WaitForInputIdle geht schon weiter. (Startzeit des Programmes ca. 2 min) Also es hilft mir nicht weiter.Danke.

-
Was hast du denn als zweiten Parameter angegeben?
-
Hi!
Ich hab 2 Programme erstellt. Bei test2 hab ich einfac in OnInitialUpdate unnötig Rechenzeit vrebufft (Sleep).STARTUPINFO si; PROCESS_INFORMATION pi; BOOL bRes; DWORD dwCode = 0; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof (STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; bRes = CreateProcess(NULL,"C:\\test2\\Debug\\test2.exe",NULL,NULL, TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); WaitForInputIdle(pi.hProcess, INFINITE); AfxMessageBox("FERTIG");Also bei mir kam FERIG erst nach dem test2.exe fertig war.
Ich hoffe das hilft einwenig weiter
mfg
-
Das einfachste wäre, ein Named Event zu erzeugen (CreateEvent, mit gleichen Namen im Aufrufer und aufgerufenem Program), und der Aufgerufene setzt das Event z.B. beim ersten "Eintritt" in CWinApp::OnIdle, oder sonstwas
Der Aufrufer kann dann mit WaitForSingleObject auf das Event warten
-
@peterchen: Das geht in diesem Fall nicht, weil er die Programme nicht selbst geschrieben hat

-
Hat er nicht? Schad....
Hab ich übersehen.
Dann WaitForInputIdle
-
wieso nicht einfach etwas einfaches:
ShellExecute(....); while(!FindWindow(...)); // hier auf das proggie warten , was von ShellExecute gestartet wurde (ev timeout einbauen !)Details für beide sachen - msdn !
-
Uli0001 schrieb:
Vollständig bedeutet nicht nur das Fenster ist vorhanden sondern das Prog. ist wieder in einer Art Ruhezustand und wartet auf eingaben.
-
@-# #-:
Weil FindWindow sowieso verboten sein sollte:
- FindWindow hängt, wenn irgendeine App mit Desktop-Fenster hängt
- FindWindow findet das Fenster - solange niemand die Aserbaidschanische version ausführt
- FindWindow ist nutzlos bei Programmen, die z.B. den aktuellen Dokumenttitel mit in der Titelleiste anzeigen
- FindWindow findet u.U. das falsche Fenster, z.B. wenn mehrere Instanzen ausgeführt, oder ein anderes programm mit zufällig dem gleichen Titel
- Man bekommt ziemlich häßliche Pickel
-
Grüße,
erst einmal Danke das ihr euch einen Kopf macht. Nur leider ist noch keine Lösung gefunden. Ich habe gerade mit WaitForInputIdle ein wenig gespielt. Es bringt auch nicht die Lösung.
Erst einmal ja ich starte Programme die nicht von mir sind. Welche das sind ist flexibel und wie viele auch.
WaitForInputIdle kommt immer zu einem sehr frühen Zeitpunkt zurück wo an ein fertig geladenes Programm noch nicht zu denken ist.
Es scheint mir sehr so als das es für diese Problem keine Lösung gibt. Wenn ihr noch andere Ideen habe dann her damit.
Uli
-
Du könntest noch GetProcessTimes() versuchen: das liefert dir die Zeit, die ein Prozeß im User- bzw. im Kernel-Mode verbrät. Wenn die Zeiten sich nicht / kaum noch ändern - Prozeß langweilt sich
Ist aber auch keine perfekte Lösung:
Prozesse mit Idle-Threads, Prozesse die auf ein Kernel-Objekt wartenAndere Möglichkeit:
Eigener Thread mit sehr geringer Prio, und dort "ticks" zählen.
Dies ist aber eher ein Indikator der gesamten Systembelastung, und fällt bei Prozessen mit Idle-Threads wieder auf die Nase.