|
View:
New views
20 Messages
—
Rating Filter:
Alert me
|
| < Prev | 1 - 2 | Next > |
|
|
Matar hilos (QThread) con el tiempoResulta 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. ¿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(); } Muchas gracias por su tiempo ¿Eres del Madrid, del Barça, del Atleti...? Apoya a tu equipo en la Zona Fan de MSN Deportes _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoA 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 > > > _________________________________________________________________ > Comparte, crea, disfruta… Descubre todo, en estos vídeos > http://www.windowslive.es _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoY 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 hio 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) > From: aacid@... > To: kde-devel-es@... > 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 > > > > > > _________________________________________________________________ > > Comparte, crea, disfruta… Descubre todo, en estos vídeos > > http://www.windowslive.es > > > _______________________________________________ > Kde-devel-es mailing list > Kde-devel-es@... > https://mail.kde.org/mailman/listinfo/kde-devel-es Ahora, GRATIS Hotmail en tu móvil ¡Descúbrelo aquí! _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoEl Lunes, 18 de Mayo de 2009, Laura Santiago de la Cal escribió:
> 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 hio durante más tiempo que el que le otorgo no > pueda y ese hilo sea desalojado... No he mirado la documentación de QThread, pero de la última vez que programé hilos usando POSIX, no me suena que algo así exista (o quizás no lo conocí por no ser muy popular). Pero por lo que dices que quieres hacer, lo más natural es usar señales (SIGSTOP, SIGKILL, etc.). Eso sí, ni idea de si algo así está en todas las plataformas que soporta Qt. -- Alex (a.k.a. suy) | GPG ID 0x0B8B0BC2 http://barnacity.net/ | http://disperso.net _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoA 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 hio 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@... > > To: kde-devel-es@... > > 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 > > > > > > > > > _________________________________________________________________ > > > Comparte, crea, disfruta… Descubre todo, en estos vídeos > > > http://www.windowslive.es > > > > _______________________________________________ > > Kde-devel-es mailing list > > Kde-devel-es@... > > https://mail.kde.org/mailman/listinfo/kde-devel-es > > _________________________________________________________________ > Descárgate ahora el nuevo Internet Explorer 8 y ten a tu alcance todos los > servicios de Windows Live ¡Gratis! > http://ie8.msn.com/microsoft/internet-explorer-8/es-es/ie8.aspx [main.cpp] #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(); } _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoPorque no añades un metodo a tu thread que te permita modificar el estado del thread para que el solito sepa que tiene que acabar? (devolver en el metodo run).
2009/5/18 Laura Santiago de la Cal <lalii24@...>
_______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempoEfectivamente 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@... > To: kde-devel-es@... > 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@... > > > To: kde-devel-es@... > > > 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. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: 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. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) con el tiempo> Date: Thu, 4 Jun 2009 13:30:32 +0200 > From: ereslibre@... > To: lalii24@... > CC: kde-devel-es@... > 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. Charlas más divertidas con el nuevo Windows Live Messenger _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Matar hilos (QThread) pasado un tiempo sin hacer sleepTengo 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@... > To: lalii24@... > CC: kde-devel-es@... > 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! _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepClaro, 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@...>
_______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepDate: Tue, 18 Aug 2009 13:35:12 +0200 From: aleixpol@... To: kde-devel-es@... 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@...>
¡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. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleep¿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@...>
_______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepY aquí está mi problema, por más que miro información por todos lados y hago pruebas no consigo nada. La última que he probado y no da error en la compilación ni la ejecución es la siguiente: QTimer *timer = new QTimer(a); connect( timer, SIGNAL(timeout()), this, SLOT(quit())); timer->start(2000); //2000=2segundos a->start(); En otra parte del código tengo: public slots: void quit() { printf("Si imprime esto FUNCIONA\n"); a->terminate(); } Gracias por vuestra ayuda Date: Tue, 18 Aug 2009 13:52:29 +0200 From: aleixpol@... To: kde-devel-es@... Subject: Re: [Kde-devel-es] Matar hilos (QThread) pasado un tiempo sin hacer sleep ¿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@...>
¡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. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepLaura Santiago de la Cal wrote:
> Estoy intentando que cada programa no hecho por mi sea un hilo que > lanzo yo desde mi programa y controlar el tiempo máximo de ejecución > mediante un Qtimer... > Y aquí está mi problema, por más que miro información por todos lados > y hago pruebas no consigo nada. > > La última que he probado y no da error en la compilación ni la > ejecución es la siguiente: > > QTimer *timer = new QTimer(a); > > connect( timer, SIGNAL(timeout()), this, SLOT(quit())); > > timer->start(2000); //2000=2segundos > > a->start(); > > > En otra parte del código tengo: > > > public slots: > > void quit() > > { > > printf("Si imprime esto FUNCIONA\n"); > > a->terminate(); > > } > > > El problema es que no me da error ni nada, pero tampoco funciona, > nunca me llega a matar al hilo ni a mostrar el mensaje... ¿alguna idea > de qué estoy haciendo mal? > > Gracias por vuestra ayuda Qt. El método terminate() está desaconsejado por buenas razones (igual que cayeron en "deprecated" los métodos stop() y resume() de la clase Thread en Java). Probablemente, el problema más difícil de depurar con el que haya bregado yo fue por matar threads a lo bestia. Avisada estás. Por otra parte, leyendo la doc de la Qt 4.5.2 veo que hay un método llamado setTerminationEnabled() que habilita/deshabilita el uso de la llamada a terminate(). Lo que no me queda claro en la doc es qué estado tiene ese miembro estático que permite o no hacer caso inmediatamente a terminate(). Lo que sí está claro es que si el estado por defecto es 'false' no hará ni caso a terminate() así que la llames 100.000 veces hasta que lo pongas a 'true'. Desconozco porqué tienes esas limitaciones en tu programa, pero es muy difícil hacer un programa basado en threads que se comporte bien si éstos no colaboran un poco. Lo civilizado sería que los threads implementaran una clase con la obligación de "cumplir un contrato". Nadie más que el thread sabe en qué momento puede pararse, así que el hilo principal no debería hacer más que llamar a un método del thread que le diga que se pare. Si éste hace caso bien, si no.... Se me ocurren varias maneras de bregar con un thread políticamente incorrecto, pero algunas de ellas no serían muy portables y dependen mucho de la implementación de los threads en el S.O. subyacente (y la implementación de Linux no es para tirar cohetes), tú sabrás si tienes necesidad de codificar con la portabilidad en mente. Es posible que hubiera soluciones mejores usando procesos en lugar de threads, habría que pensarlo. Saludos José Luis _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepRespecto a que matar hilos así derepente es mala práctica normalmente ya lo sé, pero en este caso es lo que deseo hacer ya que una vez que yo los mate me preocuparé de dejar el sistema en el estado que yo deseo, asi que por eso no hay problema. El problema es ¿cómo le mato si en un tiempo determinado no ha terminado sin bloquear la cpu con un wait()? - Hilo conversación - - Yo 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. - Yo intentando explicarme > > lanzo yo desde mi programa y controlar el tiempo máximo de ejecución > > mediante un Qtimer... > > Y aquí está mi problema, por más que miro información por todos lados > > y hago pruebas no consigo nada. > > > > La última que he probado y no da error en la compilación ni la > > ejecución es la siguiente: > > > > QTimer *timer = new QTimer(a); > > > > connect( timer, SIGNAL(timeout()), this, SLOT(quit())); > > > > timer->start(2000); //2000=2segundos > > > > a->start(); > > > > > > En otra parte del código tengo: > > > > > > public slots: > > > > void quit() > > > > { > > > > printf("Si imprime esto FUNCIONA\n"); > > > > a->terminate(); > > > > } > > > > > > El problema es que no me da error ni nada, pero tampoco funciona, > > nunca me llega a matar al hilo ni a mostrar el mensaje... ¿alguna idea > > de qué estoy haciendo mal? > > > > Gracias por vuestra ayuda - Respuestas > Me temo que lo peor que estás haciendo es no leer la documentación de la > Qt. El método terminate() está desaconsejado por buenas razones (igual > que cayeron en "deprecated" los métodos stop() y resume() de la clase > Thread en Java). Probablemente, el problema más difícil de depurar con > el que haya bregado yo fue por matar threads a lo bestia. Avisada estás. > > Por otra parte, leyendo la doc de la Qt 4.5.2 veo que hay un método > llamado setTerminationEnabled() que habilita/deshabilita el uso de la > llamada a terminate(). Lo que no me queda claro en la doc es qué estado > tiene ese miembro estático que permite o no hacer caso inmediatamente a > terminate(). Lo que sí está claro es que si el estado por defecto es > 'false' no hará ni caso a terminate() así que la llames 100.000 veces > hasta que lo pongas a 'true'. > > Desconozco porqué tienes esas limitaciones en tu programa, pero es muy > difícil hacer un programa basado en threads que se comporte bien si > éstos no colaboran un poco. Lo civilizado sería que los threads > implementaran una clase con la obligación de "cumplir un contrato" > Nadie más que el thread sabe en qué momento puede pararse, así que el > hilo principal no debería hacer más que llamar a un método del thread > que le diga que se pare. Si éste hace caso bien, si no.... > > Se me ocurren varias maneras de bregar con un thread políticamente > incorrecto, pero algunas de ellas no serían muy portables y dependen > mucho de la implementación de los threads en el S.O. subyacente (y la > implementación de Linux no es para tirar cohetes), tú sabrás si tienes > necesidad de codificar con la portabilidad en mente. Es posible que > hubiera soluciones mejores usando procesos en lugar de threads, habría > que pensarlo. Messenger cumple 10 años ¡Conéctate y celébralo con toda la comunidad! _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepLaura Santiago de la Cal wrote:
> La función terminate la tengo habilitada ya que si la pongo fuera del > slot me termina el hilo perfectamente, asi que ese no puede ser el > problema ¿Llamas a QThread::exec() desde run()? > Respecto a que matar hilos así derepente es mala práctica normalmente > ya lo sé, pero en este caso es lo que deseo hacer ya que una vez que > yo los mate me preocuparé de dejar el sistema en el estado que yo > deseo, asi que por eso no hay problema. > El problema es ¿cómo le mato si en un tiempo determinado no ha > terminado sin bloquear la cpu con un wait()? Una manera podría ser guardar en una tabla el TID y la hora proporcionada por gettimeofday del momento en que creaste el thread. Periódicamente (¿con un thread tuyo creado ex-profeso para ello?) compruebas si han transcurrido más de N segundos (o ms o lo que quieras) y si se ha pasado lo matas. El problema de ese método es que solo tiene en cuenta el tiempo transcurrido real y no el que el thread ha usado de CPU (mira getitimer si tienes dudas) Si usas Linux otro método sería usar la información que hay acerca del thread en /proc. Ahora mismo no tengo un Linux a mano, pero seguro que la información que necesitas está ahí. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleep2009/8/19 Laura Santiago de la Cal <lalii24@...>:
> La función terminate la tengo habilitada ya que si la pongo fuera del slot > me termina el hilo perfectamente, asi que ese no puede ser el problema > Respecto a que matar hilos así derepente es mala práctica normalmente ya lo > sé, pero en este caso es lo que deseo hacer ya que una vez que yo los mate > me preocuparé de dejar el sistema en el estado que yo deseo, asi que por eso > no hay problema. Creo que esto último es imposible. Si no sabes qué código ejecuta el jugador (según lo que has dicho en otro mensaje) es sencillamente imposible que dejes el sistema en el mismo estado en el que se encontraba, básicamente porque no sabes qué hizo el código del jugador. Imagínate que por alguna razón desconocida, ha abierto un fichero y está escribiendo sobre él en el momento en el que matas el hilo. Es imposible que puedas dejar el sistema en el mismo estado en el que se encontraba. Un saludo, Rafael Fernández López. _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleepAdemás yo lo que digo no es que vaya a dejarlo en el estado anterior sino en el estado que yo deseo... Voy a explicar mi caso con más detenimiento a ver si así me explico mejor Estoy creando un programa que se encargará de enfrentar a otros dos programas escritos por usuarios que no conozco, en este caso concreto cada usuario escribe un jugador de tennis y tiene que intentar ganar el partido, para moverse, golpear y tal les facilito una librería de funciones. El programa que yo controlo va cediendo el turno a cada uno de los otros 2 programas por turnos (estos se ejecutan en forma de hilo) y lo único que busco es que si uno de los 2 usuarios sin querer (o adrede) se mete en un bucle infinito desalojar ese hilo de la cpu y darlo como si no hubiera hecho nada (no quiere avanzar ni golpear ni nada) y preguntarle al otro que quiere hacer... No sé si me he explicado, espero que sí... a ver si alguien me puede ayudar a eso, a desalojar un hilo de la cpu si ha excedido un tiempo (sé que puedo poner wait(x) y luego matarlo, pero no quiero bloquear la cpu) A ver si hay suerte y alguien me puede ayudar... > Date: Wed, 19 Aug 2009 13:20:31 +0200 > From: ereslibre@... > To: kde-devel-es@... > Subject: Re: [Kde-devel-es] Matar hilos (QThread) pasado un tiempo sin hacer sleep > > 2009/8/19 Laura Santiago de la Cal <lalii24@...>: > > La función terminate la tengo habilitada ya que si la pongo fuera del slot > > me termina el hilo perfectamente, asi que ese no puede ser el problema > > Respecto a que matar hilos así derepente es mala práctica normalmente ya lo > > sé, pero en este caso es lo que deseo hacer ya que una vez que yo los mate > > me preocuparé de dejar el sistema en el estado que yo deseo, asi que por eso > > no hay problema. > > Creo que esto último es imposible. Si no sabes qué código ejecuta el > jugador (según lo que has dicho en otro mensaje) es sencillamente > imposible que dejes el sistema en el mismo estado en el que se > encontraba, básicamente porque no sabes qué hizo el código del > jugador. > > Imagínate que por alguna razón desconocida, ha abierto un fichero y > está escribiendo sobre él en el momento en el que matas el hilo. Es > imposible que puedas dejar el sistema en el mismo estado en el que se > encontraba. > > > Un saludo, > Rafael Fernández López. > _______________________________________________ > Kde-devel-es mailing list > Kde-devel-es@... > https://mail.kde.org/mailman/listinfo/kde-devel-es ¿Quieres los nuevos emoticonos en 3D? ¡Descárgatelos gratis! _______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
|
|
Re: Matar hilos (QThread) pasado un tiempo sin hacer sleep2009/8/19 Laura Santiago de la Cal <lalii24@...>
Puedes usar QTimer::singleShot(). El tema es que si matas un thread puedes dejar el programa entero en un estado descontrolado. Saludos, Aleix
_______________________________________________ Kde-devel-es mailing list Kde-devel-es@... https://mail.kde.org/mailman/listinfo/kde-devel-es |
| < Prev | 1 - 2 | Next > |
| Free embeddable forum powered by Nabble | Forum Help |