Terminé de implementar un programa Go donde el ser humano puede interrumpir en cualquier momento el software para ordenar su reproducción. Básicamente, tengo un algoritmo ejecutándose en otro hilo que tiene en todo momento el "Mejor movimiento" disponible, que sigue mejorando.Cómo interrumpir correctamente un bucle infinito QThread
Mi pregunta es: ¿cómo puedo interrumpir correctamente un hilo en un ciclo infinito?
He intentado algunas cosas, y decidí hacer esto:
class MyWorker : public QObject
{
Q_OBJECT
public:
MyWorker();
~MyWorker();
public:
ThreadControl * getThreadControl();
public slots:
void work();
private:
void endOfComputation();
private:
ThreadControl * threadControl;
}
Aviso que don't subclass QThread:
class ThreadControl : public QObject
{
Q_OBJECT
public:
ThreadControl();
public:
bool getAbort();
Parameter getParameter();
void setParameter(Parameter & param);
public slots:
void setAbort(bool b);
private:
QMutex mutex;
bool abort;
Parameter param;
};
Y, por último, el bucle infinito se codifica como esto:
void Myworker::work()
{
// ...
forever
{
abort = threadControl->getAbort();
if(abort)
{
break;
}
// ...
}
endOfComputation();
}
Entonces, como se puede adivinar, en el main
, Me llaman regularmente ThreadControl::setAbort(true)
Básicamente, yo sigo un puntero a un valor lógico en el hilo principal y activarlo cuando quiero. (El booleano está encapsulado en ThreadControl
por lo que puedo bloquearlo correctamente con un mutex). Hasta ahora todo ha sido bueno para mí ... ¡Pero me parece repugnante! Alternar punteros a booleanos suena como ... programación incorrecta para mí ...
El problema es que la documentación en la web es en su mayoría (¿totalmente?) Sobre hilos de productores y consumidores, que terminan después de un tiempo finito, no cuando se lo piden a. No se desarrolla la interrupción de un hilo, es por eso que estoy preguntando: ¿Hay una mejor manera?
hilo impulso no funciona con QThread. la gente usa qthread a menudo porque es una aplicación qt gui. –
Mi objetivo era proporcionar otra forma de interrumpir ese hilo. Se agregó una implementación de muestra. – tibur