¿Cómo detengo un Thread?

Iniciado por Zodiak98, 27 Diciembre 2014, 06:55 AM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

Verán, quisiera saber cómo hago para detener la ejecución de un Thread mediante una condición. O sea que, si se cumple dicha condición detener la ejecución de ese Thread.

Tengo un código así:
Código (cpp) [Seleccionar]
#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

void firstfor(int* x2)
{
for(int x = 0; x <= 9999; ++x)
{
*x2 = x;
Sleep(20);
}

cout << "\nThis for has finished!" << endl;
}

int main(void)
{
int x = 0;
int y = 1;

thread funcion1(firstfor, &x);

while(1)
{
cout << "Type either '1' or '0': "; cin >> y;

if (y == 0)
{

break;
}
else if(y == 1)
{
cout << "Currently the 'x' value is: " << x << endl;
Sleep(1000);
}

system("cls");
}

cin.get();
return 0;
}


Básicamente el programa te pide que ingreses ya sea el número 0 o 1 para ver qué valor tiene el valor de la variable 'x' actualmente, ya que dicha valor se está aumentado en un proceso diferente. Pero quiero saber cómo hacer para detener ese thread cuando el usuario ingrese el valor 0.

ivancea96

#1
Puedes mandarle al thread la dirección de una variable del main (bool, por ejemplo), y que cuando la variable sea false, retorne.

Por lo demás, no me parece productivo cerrar un thread de golpe, en caso de que se pueda.

Zodiak98

Hehe gracias. :) Utilicé una variable booleana global para reconocer lo que había ingresado por teclado y tomar la decisión del for. Me quedó así:

Código (cpp) [Seleccionar]
#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

bool dThread = false;

void firstfor(int* x2)
{
for(int x = 0; x <= 9999; ++x)
{
if(!dThread)
{
*x2 = x;
Sleep(20);
}
else
{
break;
}
}

cout << "\nThis for has finished!" << endl;
}

int main(void)
{
int x = 0;
int y = 1;

thread funcion1(firstfor, &x);

while(1)
{
cout << "Type either '1' or '0': "; cin >> y;

if (y == 0)
{
dThread = true;
break;
}
else if(y == 1)
{
cout << "Currently the 'x' value is: " << x << endl;
Sleep(1000);
}

system("cls");
}

funcion1.join();

system("pause>nul");
return 0;
}

ThunderCls

Si estas en Windows puedes hacer uso de las API's: SuspendThread/ResumeThread para pausar y/o resumir un hilo asi como TerminateThread para causar su terminacion.
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/