elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Interrumpir un thread que está en "Sleep()" c++/cli
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Interrumpir un thread que está en "Sleep()" c++/cli  (Leído 2,428 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Interrumpir un thread que está en "Sleep()" c++/cli
« 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.


« Última modificación: 13 Julio 2014, 13:36 pm por SARGE553413 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Interrumpir un thread que está en "Sleep()" c++/cli
« Respuesta #1 en: 13 Julio 2014, 14:33 pm »

Hola

Aquí 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), y en su defecto deberías utilizar la Class BackgroundWorker 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


« Última modificación: 13 Julio 2014, 14:44 pm por Eleкtro » En línea



SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Interrumpir un thread que está en "Sleep()" c++/cli
« Respuesta #2 en: 16 Julio 2014, 12:06 pm »

Ok, gracias, ya he entendido.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines