2010-02-04 14 views
9

Tengo una aplicación Win32 VC++ nativa que al ingresar WinMain() inicia un hilo por separado, luego hace un trabajo útil mientras el otro hilo se está ejecutando, luego simplemente sale de WinMain() - el otro hilo no se detiene explícitamente.¿Es necesario detener explícitamente todos los hilos antes de salir de una aplicación Win32?

This blog post dice que una aplicación .NET no terminará en este caso ya que el otro subproceso aún se está ejecutando. ¿Se aplica lo mismo a las aplicaciones Win32 nativas?

¿Debo detener todos los hilos antes de salir?

Respuesta

2

No, cuando WinMain devoluciones, se dará por terminado el proceso, y esto significa que todos los hilos generados por el proceso deben terminar aunque no estén cerrados con gracia.

Sin embargo, es posible que un subproceso primario se termine mientras los otros subprocesos se están ejecutando, lo que resulta en que la aplicación aún se está ejecutando. Si llama al ExitThread (no a exit o ExitProcess) en WinMain, y hay subprocesos en ejecución (eventualmente creados por el subproceso principal), entonces, puede observar este comportamiento. No obstante, el solo retorno en WinMain llamará al ExitProcess, y eso significa que todos los hilos deben terminarse.

Corrígeme si está mal.

+0

La explicación dada aquí es 100% correcta. Lo validé, el subproceso WinMain fue creado por C Runtime y cuando el subproceso salió del C Runtime llamado ExitProcess, lo que provocó que la aplicación completa terminara (incluidos otros subprocesos). –

3

El corto de él es: Para un proceso nativo Win32 para terminar, una de las dos condiciones deben cumplirse:

  • Alguien llama ExitProcess o TerminateProcess.
  • Todos los subprocesos salen (volviendo de su ThreadProc (incluido el WinMainEntryPoint que es el primer subproceso creado por windows)), close (al llamar a ExitThread) o terminados (alguien llama TerminateThread).

(La primera condición es realmente la misma que la 2da: ExitProcess y TerminateProcess, como parte de su limpieza, ambos llaman TerminateThread en cada subproceso en el proceso).

El c-tiempo de ejecución impone diferentes condiciones: Para una aplicación C/C++ para terminar, usted debe:

  • regreso de principal (o WinMain).
  • salida llamada()

Calling salida() o regresar de main() tanto hacer que el c-tiempo de ejecución para llamar ExitProcess().Que es cómo c & las aplicaciones C++ salen sin limpiar sus hilos. Yo, personalmente, creo que esto es algo malo.

Sin embargo, los procesos no triviales de Win32 nunca pueden terminar porque muchos subsistemas Win32 perfectos, por lo demás razonables, crean subprocesos de trabajo. winsock, ole, etc. Y no proporcionan ninguna forma de hacer que esos hilos se cierren espontáneamente.

0

Creo que primero puede cerrar todas sus ventanas (para que el usuario no vea su aplicación), y luego establecer una bandera para salir, su hilo debe verificar el indicador periódicamente, y una vez encontrado establecido, el hilo debe regresar .

Después de establecer la bandera, su hilo principal podría llamar a :: WaitForSingleObject() o :: WaitForMultipleObjects() por un tiempo (digamos, tres segundos), si el (los) hilo (s) no regresan, simplemente elimínelos por :: TerminateThread().

Cuestiones relacionadas