[Kde-devel-es] Matar hilos (QThread) con el tiempo

Laura Santiago de la Cal lalii24 at hotmail.com
Thu Jun 4 11:16:02 CEST 2009


Hola de nuevo
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?
Muchas gracias a todos

NOTA: Copio el codigo que me ha enviado Albert para qeu todos puedan verlo:

#include <qdebug.h>
#include <QApplication>
#include <QThread>

class A : public QThread{
    public:
        void run()        {
            while(1)                qDebug() << "Soy a";
        }
};

class B : public QThread
{
    void run()        {
            while(1)                qDebug() << "Soy b";
        }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    A *a = new A();
    a->start();
    B *b = new B();
    b->start();
    sleep(3);
    a->terminate();
    sleep(1); 
    b->terminate();
}

> From: aacid at kde.org
> To: kde-devel-es at kde.org
> Date: Mon, 18 May 2009 23:23:58 +0200
> Subject: Re: [Kde-devel-es] Matar hilos (QThread) con el tiempo
> 
> A Dilluns, 18 de maig de 2009, Laura Santiago de la Cal va escriure:
> > Hola, tambien había probado anteriormente con terminate() (se me olvidó
> > ponerlo) y tampoco me termina la ejecución del hilo... Y efectivamente no
> > tengo un bucle de eventos en mi hilo, explico un poco porque quiero acabar
> > con un hilo pasado X segundos. Resulta que estoy haciendo un "motor" que
> > manejará hilos escritos por usuarios desconocidos para mi sistema, y lo que
> > pretendo es que si este usuario quiere ejecutar su hilo durante más tiempo
> > que el que le otorgo no pueda y ese hilo sea desalojado...
> >
> > ¿Alguna otra idea? (Gracias Albert por contestar tan rápido)
> 
> Algo haces mal, como puedes comprobar con el ejemplo adjunto terminate si mata 
> a los threads.
> 
> Albert
> 
> >
> > > From: aacid at kde.org
> > > To: kde-devel-es at kde.org
> > > Date: Sat, 16 May 2009 18:34:17 +0200
> > > Subject: Re: [Kde-devel-es] Matar hilos (QThread) con el tiempo
> > >
> > > A Divendres, 15 de maig de 2009, Laura Santiago de la Cal va escriure:
> > > > Hola, soy nueva en esta listasde distribución (me la recomendaron desde
> > > > otra) y tengo un problema que he mirado por todas partes y no le
> > > > encuentro solución, espero que alguno de ustedes me pueda orientar.
> > > > Resulta que tengo un proceso que quiero que "guie" 2 hilos (QThread),
> > > > para ello lo que quiero es que llame al primero e independientemente de
> > > > porque parte de la ejecución se encuentre este hilo a los 5 segundos
> > > > mate a este hilo y llame al segundo.
> > >
> > > No, no quieres hacer eso, matar un thread independientemente de la parte
> > > en la que se encuentre es una MUY MALA práctica de programación.
> > >
> > > > ¿Alguien sabe como hacerlo? Lo que yo he intentado es lo
> > > > siguiente, pero no funciona:
> > > >
> > > > //Los 2 procesos que compiten
> > > >     a = new clase() ; //clase herda de QThread
> > > >     b = new clase() ;
> > > >
> > > >     //Controlamos los hilos hasta que hay un ganador
> > > >     while(get_win()==-1)
> > > >     {
> > > >
> > > >         QTimer::singleShot(6, a, SLOT(quit()));
> > > >         QTimer::singleShot(6, b, SLOT(quit()));
> > > >         a->start();
> > > >         b->start();
> > > >         update();
> > > > }
> > >
> > > No funciona porque
> > >
> > > void QThread::quit()
> > > Tells the thread's event loop to exit with return code 0 (success).
> > > Equivalent to calling QThread::exit(0).
> > > This function does nothing if the thread does not have an event loop.
> > >
> > > Y más que probablemente tu thread no tenga un event loop.
> > >
> > > Si lo que quieres es matar el thread (ya te he dicho que no deberias
> > > hacerlo) tienes
> > >
> > > void QThread::terminate()
> > > Terminates the execution of the thread.
> > > When the thread is terminated, all threads waiting for the thread to
> > > finish will be woken up.
> > > Warning: This function is dangerous and its use is discouraged. The
> > > thread can be terminate at any point in its code path. Threads can be
> > > terminated while modifying data. There is no chance for the thread to
> > > cleanup after itself, unlock any held mutexes, etc. In short, use this
> > > function only if absolutely necessary.
> > >
> > > Pues eso, que para 3 slots que tiene QThread no habias leido la
> > > documentación con suficientes ganas.
> > >
> > > Albert
> > >
> > > > Muchas gracias por su tiempo
> > > >
 

_________________________________________________________________
Nuevo Windows Live, un mundo lleno de posibilidades. Descúbrelo.
http://www.microsoft.com/windows/windowslive/default.aspx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/kde-devel-es/attachments/20090604/afc03617/attachment.htm 


More information about the Kde-devel-es mailing list