Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: SARGE553413 en 13 Julio 2014, 12:27 pm



Título: Interrumpir un thread que está en "Sleep()" c++/cli
Publicado por: SARGE553413 en 13 Julio 2014, 12:27 pm
Hola a todos, tengo problemas para conseguir interrumpir la ejecución de un hilo que está "sleeping" y no entiendo por qué, adjunto el código:
Código
  1. void pr2(void){
  2. try{
  3.                       Object ^o=gcnew Object();
  4. ParameterizedThreadStart ^ths=gcnew ParameterizedThreadStart(prueba2);
  5. Thread th(ths);
  6. th.Start(o);
  7. th.Interrupt();
  8. }catch(ThreadInterruptedException ^the){
  9. //Hacer algo
  10. }
  11. }
  12.  
  13. void prueba2(Object ^o){
  14. try{
  15. Monitor::Enter(o);
  16. for(int i=0;i<5;i++){
  17. Thread::Sleep(1000);
  18. }
  19. }catch(ThreadInterruptedException ^thi){
  20. throw gcnew ThreadInterruptedException();
  21. }finally{
  22. Monitor::Exit(o); //<==¿Esto está bien aquí?
  23. }
  24. }
  25.  
El problema mas grave es que despues de "interrumpir" el hilo, el programa sigue en ejecución, lo tengo que terminar con el admin. de tareas.

El segundo problema es que en prueba2() capturo la excepción y la vuelvo a lanzar, pero pr2() no se entera y no entiendo por qué.

¿Qué es lo que hago mal?

Además, entiendo que lo de Monitor::Enter() es como el sychronized() de java, ¿me equivoco?.

En tal caso, para poder interrumpir la ejecución de un hilo sin que haya error, el hilo tiene que haber hecho Monitor::Enter() antes?

Gracias y saludos.


Título: Re: Interrumpir un thread que está en "Sleep()" c++/cli
Publicado por: Eleкtro en 13 Julio 2014, 14:33 pm
Hola

Aquí (http://stackoverflow.com/questions/7064811/why-is-thread-not-interrupted-when-sleeping-in-finally-block) tienes la respuesta extendida a tu pregunta.

De todas formas te advierto que si tienes pensado controlar y manipular el estado de un hilo entonces deberias olvidar el uso de la Class Thread, ya que los métodos para pausar/continuar son obsoletos e intrusivos (como nos explican en MSDN (http://msdn.microsoft.com/en-us/library/tttdef8x%28v=vs.110%29.aspx)), y en su defecto deberías utilizar la Class BackgroundWorker (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker%28v=vs.110%29.aspx) para manejar hilos, te llevaría bastante más escritura de código (de echo yo escribo una Class distinta para meter todo lo relacionado con cada BackgroundWorker) pero sin duda es más eficiente.

Saludos


Título: Re: Interrumpir un thread que está en "Sleep()" c++/cli
Publicado por: SARGE553413 en 16 Julio 2014, 12:06 pm
Ok, gracias, ya he entendido.

Saludos.