Come determinare quando processo generato è pronto? (Utilizzando CreateProcess () e FindWindow ())

StackOverflow https://stackoverflow.com/questions/4107499

  •  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?

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top