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

Aleix Pol aleixpol at kde.org
Tue Aug 18 13:52:29 CEST 2009


¿Cómo programarlo? Una pregunta un poco generica...
Asumiré que me preguntas qué opciones tienes:

Si no puedes controlar nada del código del jugador, supongo que lo más
correcto sería tenerlos en procesos distintos. Para matarlo simplemente
mandarías una señal al proceso en cuestión y listo. Podrías comunicar los
procesos usando sockets.

Sino, yo añadiría un método a tu implementación del QThread que modificara
una variable que diría al algoritmo de QThread::run que tiene que acabar de
forma que no se rompa nada.

Si no tienes acceso al código pero quieres seguir usando threads, puedes
usar QThread::terminate para parar el thread.

Para contar los segundos que te esperarás puedes usar QTimer.

2009/8/18 Laura Santiago de la Cal <lalii24 at hotmail.com>

>  ¿Cómo programarlo?
>
> ------------------------------
> Date: Tue, 18 Aug 2009 13:35:12 +0200
> From: aleixpol at kde.org
> To: kde-devel-es at kde.org
> Subject: Re: [Kde-devel-es] Matar hilos (QThread) pasado un tiempo sin
> hacer sleep
>
>
> Claro, puedes tener un hilo para cada proceso que tienes en background.
> Puedes controlarlos desde el thread principal.
> Cual es el problema?
>
> 2009/8/18 Laura Santiago de la Cal <lalii24 at hotmail.com>
>
>  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 temporizador
> jugador2->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.
>
> ------------------------------
> Messenger cumple 10 años ¡Conéctate y celébralo con toda la comunidad!<http://www.vivelive.com/aniversariomessenger>
>
> _______________________________________________
> Kde-devel-es mailing list
> Kde-devel-es at kde.org
> https://mail.kde.org/mailman/listinfo/kde-devel-es
>
>
>
> ------------------------------
> ¡Que no te pillen atascos ni radares! En MSN te damos toda la información
> sobre el estado de las carretas y te mostramos dónde se encuentran los
> radares de tráfico. <http://motor.es.msn.com/servicios/>
>
> _______________________________________________
> Kde-devel-es mailing list
> Kde-devel-es at kde.org
> https://mail.kde.org/mailman/listinfo/kde-devel-es
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/kde-devel-es/attachments/20090818/a8e99fd6/attachment-0001.htm 


More information about the Kde-devel-es mailing list