Generalmente esto (llamando TerminateThread) es una mala cosa que hacer porque un hilo puede asignar algunos recursos (es decir, los descriptores de archivos), que no estará disponible hasta terminar todo el proceso. Aún más, CloseHandle no detiene el hilo.
Si tiene alguna operación lenta dentro de su hilo, a continuación, al menos de la bicicleta de
while(!ShouldExit)
{
DoOneMoreIteration();
}
. De esta forma puede terminar el hilo estableciendo ShouldExit en 1 (o 'verdadero', si es variable C++ y bool) y la llamada WaitForSingleObject en el identificador de este subproceso para asegurarse de que haya finalizado.
Para el comentario de los protagonistas: The ShouldExit debe declararse como 'volátil'.
Si está esperando alguna entrada (una consola, supongo), entonces puede usar la E/S no bloqueada ("superpuesta") con entrada estándar.
por ejemplo, véase la siguiente pregunta: Checking Win32 file streams for available input
Sería algo así como
HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
while(!ShouldExit) {
if(WaitForSingleObject(h, FALSE, SomeTimeoutValue) == WAIT_OBJECT_0)
{
... use std::cin - it has some input and won't block
}
}
Para hacer las cosas mejor (evitar overburn CPU) utiliza WaitForMultipleObjects y romper fuera del bucle en algún evento externo.
/// Global var
HANDLE SomeGlobalEvent;
/// ThreadProc():
HANDLE h[2];
h[0] = GetStdHandle(STD_INPUT_HANDLE);
h[1] = SomeGlobalEvent;
while(true) {
DWORD which = WaitForMultipleObjects(2, h, FALSE, SomeTimeoutValue);
if(which == WAIT_OBJECT_0)
{
... use std::cin - it has some input and won't block
} else
if(which == WAIT_OBJECT_1)
{
// got the termination event
break;
}
}
/// "Main" thread:
SomeGlobalEvent = CreateEvent(NULL, false, false, NULL);
HANDLE hThread = _beginthread(ThreadProc, 4096, NULL);
....
/// send termination signal
SetEvent(SomeGlobalEvent);
/// Wait for thread completion
WaitForSingleObject(hThread);
@kakush, si va por 'ShouldExit', asegúrese de declararlo como' volátil'.De lo contrario, podría no ser el truco. – eran
@eran, tienes razón. –
@eran: el truco 'volátil 'funciona * solo * para los compiladores de Visual C++. Es posible que no funcione en otros compiladores. –