[Kde-devel-es] Matar hilos (QThread) pasado un tiempo sin hacer sleep

Laura Santiago de la Cal lalii24 at hotmail.com
Tue Aug 18 11:29:10 CEST 2009


Hola, explico lo que busco.
Tengo 2 jugadores, estos jugadores no los programo yo y entonces no sé lo que pone dentro de su código, cada uno de estos dos jugadores será un hilo de mi programa.Lo que quiero es que si el programa que contenga el jugador 1 (o el 2) tarda más de 5 segundos en ejecutarse entero matarlo, pero si tarda por ejemplo 2 segundos mi programa principal no se quede bloqueada durante otros 3 segundos sino que continue con lo siguiente.En pseudocódigo sería algo así
iniciar temporizador;jugador1->jugar;si jugador1 ha acabado o temporizador==fin    jugador->terminate;iniciar temporizadorjugador2->jugar;si jugador2 ha acabado o temporizador==fin    jugador->terminate;
Es decir, quiero que el jugador2 juegue siempre despues del jugador1, pero quiero que si el jugador1 tarda mucho en acabar se le pase su turno y sea el turno del jugador2...
Es una especie de seguridad ya que no sé que contienen los hilos que ejecuto porque son de usuarios externos, pero en ningún caso quiero hacer un sleep(5) en mi programa, porque busco que sea lo más rápido posible, y si el jugador1 tardara solo 1 segundo en hacer su operación sería inconcedible que el programa principal estuviera otros 4 esperando
A ver si alguien sabe si se puede o no hacer algo similar.
Gracias
> Date: Thu, 4 Jun 2009 13:30:32 +0200
> From: ereslibre at kde.org
> To: lalii24 at hotmail.com
> CC: kde-devel-es at kde.org
> Subject: Re: [Kde-devel-es] Matar hilos (QThread) con el tiempo
> 
> > Hola de nuevo
> 
> Buenas,
> 
> > Efectivamente así si que me termina la ejecución del hilo (muchas   
> > gracias) pero con ello no puedo hacer lo que quiero del todo   
> > correcto (por decirlo de alguna manera) ya que el programa principal  
> >  no quiero que se quede dormido, quiero que si el hilo termina por  
> > sí  sólo en menos de Xsegundos seguir con la ejecución normal, pero  
> > si  tarda más de esos segundos matarlo yo y seguir con la ejecución   
> > normal...
> > ¿Alguna idea de cómo hacer esto?
> 
> Cuando ejecutas un hilo, al no ser que esperes a una variable  
> condicional o hagas un lock sobre un mutex o sobre un semáforo que te  
> bloquee (o un join sobre el thread recientemente iniciado), la  
> ejecución sigue normal. Es decir:
> 
> programaPrincipal()
> {
>      lanzaThread1();
>      hazAlgo();
> }
> 
> El código de hazAlgo() se va a ejecutar (muy probablemente, depende  
> del scheduler del SO y demás...) en paralelo con el código que  
> lanzaThread ejecute al lanzar el nuevo thread.
> 
> Por tanto, lo que supongo que quieres es:
> 
> programaPrincipal()
> {
>      lanzaThread();
>      // espero a que termine lanzaThread()
>      hazAlgo();
> }
> 
> Entonces, no entiendo muy bien el sentido de crear un nuevo thread.  
> Porque realmente, si lanzaThread() creara un thread y llamara a  
> ejecutaCodigo(), por ejemplo, esto último sería equivalente a:
> 
> programaPrincipal()
> {
>      ejecutaCodigo();
>      hazAlgo();
> }
> 
> ¿Cuál es el motivo de esto? Es decir, ¿qué quieres conseguir?  
> ¿ejecutar algo costoso o bloqueante sin que se quede colgada la  
> interfaz?
> 
> Si es así, hay dos formas de hacerlo... con una guarrería  
> (QEventLoop), o algo en condiciones, hacer todo de manera asíncrona y  
> que el thread lance una señal que haga que algo cambie en la interfaz  
> cuando termine su ejecución.
> 
> 
> Un saludo,
> Rafael Fernández López.

_________________________________________________________________
Internet Explorer 8 más sencillo y seguro ¡Descárgatelo gratis!
http://events.es.msn.com/noticias/internet-explorer-8/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/kde-devel-es/attachments/20090818/7c124bd9/attachment.htm 


More information about the Kde-devel-es mailing list