Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 27 Diciembre 2014, 06:55 am



Título: ¿Cómo detengo un Thread?
Publicado por: Zodiak98 en 27 Diciembre 2014, 06:55 am
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
  1. #include <iostream>
  2. #include <thread>
  3. #include <Windows.h>
  4.  
  5. using namespace std;
  6.  
  7. void firstfor(int* x2)
  8. {
  9. for(int x = 0; x <= 9999; ++x)
  10. {
  11. *x2 = x;
  12. Sleep(20);
  13. }
  14.  
  15. cout << "\nThis for has finished!" << endl;
  16. }
  17.  
  18. int main(void)
  19. {
  20. int x = 0;
  21. int y = 1;
  22.  
  23. thread funcion1(firstfor, &x);
  24.  
  25. while(1)
  26. {
  27. cout << "Type either '1' or '0': "; cin >> y;
  28.  
  29. if (y == 0)
  30. {
  31.  
  32. break;
  33. }
  34. else if(y == 1)
  35. {
  36. cout << "Currently the 'x' value is: " << x << endl;
  37. Sleep(1000);
  38. }
  39.  
  40. system("cls");
  41. }
  42.  
  43. cin.get();
  44. return 0;
  45. }

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.


Título: Re: ¿Cómo detengo un Thread?
Publicado por: ivancea96 en 27 Diciembre 2014, 12:58 pm
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.


Título: Re: ¿Cómo detengo un Thread?
Publicado por: Zodiak98 en 27 Diciembre 2014, 17:21 pm
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
  1. #include <iostream>
  2. #include <thread>
  3. #include <Windows.h>
  4.  
  5. using namespace std;
  6.  
  7. bool dThread = false;
  8.  
  9. void firstfor(int* x2)
  10. {
  11. for(int x = 0; x <= 9999; ++x)
  12. {
  13. if(!dThread)
  14. {
  15. *x2 = x;
  16. Sleep(20);
  17. }
  18. else
  19. {
  20. break;
  21. }
  22. }
  23.  
  24. cout << "\nThis for has finished!" << endl;
  25. }
  26.  
  27. int main(void)
  28. {
  29. int x = 0;
  30. int y = 1;
  31.  
  32. thread funcion1(firstfor, &x);
  33.  
  34. while(1)
  35. {
  36. cout << "Type either '1' or '0': "; cin >> y;
  37.  
  38. if (y == 0)
  39. {
  40. dThread = true;
  41. break;
  42. }
  43. else if(y == 1)
  44. {
  45. cout << "Currently the 'x' value is: " << x << endl;
  46. Sleep(1000);
  47. }
  48.  
  49. system("cls");
  50. }
  51.  
  52. funcion1.join();
  53.  
  54. system("pause>nul");
  55. return 0;
  56. }


Título: Re: ¿Cómo detengo un Thread?
Publicado por: ThunderCls en 2 Enero 2015, 03:27 am
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