Come determinare quando processo generato è pronto? (Utilizzando CreateProcess () e FindWindow ())
-
29-09-2019 - |
Domanda
Questo dovrebbe essere facile: Sto creando un programma che genera un processo utilizzando la funzione Win32 CreateProcess()
. Una volta che questo processo è stato caricato, trovo la sua finestra usando FindWindow
e mando messaggi utilizzando SendMessage()
. La domanda è: come faccio a sapere quando quella finestra è pronta ad accettare i messaggi?
Si consideri il seguente:
HWND wnd;
BOOL Start()
{
// Spawn the process
if (! CreateProcess(...))
return FALSE;
// Find the process's window (class and name already known)
wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);
// Always returns FALSE because window has not yet been created.
return (wnd != NULL);
}
Il codice qui sopra (? Quasi) sempre esito negativo; la finestra non può essere creato e ha scoperto che in fretta. Se metto un'attesa filo, dire Sleep(1000)
, tra le chiamate CreateProcess
e FindWindow
, funziona benissimo. Ma questo si sente come un molto Bad mod.
Come posso migliorare questo?
Soluzione
(Modifica): utente IInspectable ha sottolineato i problemi con WaitForInputIdle()
, e ha suggerito CBT Ganci .
(...) funzione di callback utilizzata con il SetWindowsHookEx funzione. Il sistema richiama questa funzione prima di attivare, la creazione, (...) una finestra; (... tante altre cose).
Inoltre, CBT è l'abbreviazione di computer-based training, per qualsiasi motivo.
(Vecchio, attenzione, vedere i commenti.) Siete alla ricerca di WaitForInputIdle () . Citazione:
Quando un processo padre crea un bambino processo, la funzione CreateProcess ritorni senza attesa per il bambino elaborare per terminare la sua inizializzazione. Prima di provare a comunicare con il processo figlio, la lattina processo genitore utilizzare la funzione di WaitForInputIdle determinare quando il bambino è inizializzazione è stata completata.
Altri suggerimenti
Hai guardato WaitForInputIdle ?
Se il processo si sta iniziando è quello che si può cambiare, lo hanno inviare un messaggio di nuovo al genitore quando è pronto. È possibile passare il HWND del genitore come un parametro di riga di comando, o l'uso FindWindow
se si può garantire che il genitore sarà unica.
Si considera che il codice sorgente di entrambi i processi è sotto il vostro controllo.
- È possibile lasciare che il secondo processo di inviare un messaggio al primo quando è pronto, se il secondo conosce i dettagli necessari del primo processo di finestra dei messaggi.
- Oppure si può attendere nel primo processo per un concordato oggetto di sincronizzazione di nome, come evento o mutex, essendo impostato dal secondo processo.