2010-02-04 7 views
9

Ho un'applicazione VC++ nativa per Win32 che al momento dell'ingresso WinMain() avvia un thread separato, quindi esegue un lavoro utile mentre l'altro thread è in esecuzione, quindi esce semplicemente WinMain() - l'altro thread non viene arrestato in modo esplicito.È necessario interrompere esplicitamente tutti i thread prima di uscire da un'applicazione Win32?

This blog post afferma che un'applicazione .NET non verrà terminata in questo caso poiché l'altro thread è ancora in esecuzione. Lo stesso vale per le applicazioni native Win32?

Devo interrompere tutti i thread prima di uscire?

risposta

2

No, quando WinMain ritorni, sarà terminato il processo, e questo significa che tutti i thread generati dal processo dovrebbero essere terminati anche se potrebbero non essere chiusi con garbo.

Tuttavia, è possibile che un thread primario sia terminato mentre gli altri thread sono in esecuzione, il risultato è che l'applicazione è ancora in esecuzione. Se si chiama ExitThread (non exit o ExitProcess) in WinMain e vi sono thread in esecuzione (eventualmente creati dal thread primario), è possibile osservare questo comportamento. Tuttavia, basta tornare in WinMain chiamerà ExitProcess, e ciò significa che tutti i thread devono essere terminati.

Correggimi se è sbagliato.

+0

La spiegazione fornita qui è corretta al 100%. L'ho convalidato, il thread WinMain è stato creato da C Runtime e quando il thread è terminato da C Runtime chiamato ExitProcess che ha causato la chiusura dell'intera applicazione (inclusi altri thread). –

3

Il corto di esso è: Per un processo Win32 nativo per terminare, deve essere soddisfatta una delle due condizioni:

  • Qualcuno chiama ExitProcess o TerminateProcess.
  • Tutti i thread escono (tornando dal ThreadProc (incluso il WinMainEntryPoint che è il primo thread creato da Windows)), chiudono (chiamando ExitThread) o terminano (qualcuno chiama TerminateThread).

(la prima condizione è in realtà la stessa del secondo: ExitProcess e TerminateProcess, come parte della loro pulizia, entrambi chiamano TerminateThread su ogni thread nel processo).

Il c-runtime impone diverse condizioni: Per un'applicazione C/C++ per terminare, occorre:

  • ritorno dalla principale (o WinMain).
  • chiamata exit()

chiamata exit() o di ritorno da main() sia causa il c-runtime chiamare ExitProcess().Quale è il modo in cui le applicazioni C++ c & escono senza pulire i loro thread. Io, personalmente, penso che questa sia una brutta cosa.

Tuttavia, i processi Win32 non banali non possono mai terminare perché molti sottosistemi Win32 perfettamente, altrimenti ragionevoli, creano thread di lavoro. winsock, ole, ecc. E non forniscono alcun modo per far chiudere spontaneamente quei thread.

0

Penso che si possa prima chiudere tutte le finestre (quindi l'utente non vedrà l'applicazione), quindi impostare un flag per l'uscita, il thread dovrebbe controllare periodicamente il flag, e una volta trovato il thread dovrebbe tornare .

dopo aver impostato il flag, il thread principale potrebbe chiamare :: WaitForSingleObject() o :: WaitForMultipleObjects() per un po '(ad esempio, tre secondi), se il thread non restituisce, è sufficiente eliminarli per :: TerminateThread().

Problemi correlati