【发布时间】:2015-05-01 22:32:21
【问题描述】:
我已经完成了一个围棋程序,人类可以随时中断软件以命令它运行。基本上,我有一个算法在另一个线程中运行,它每时每刻都有一个可用的“最佳移动”,它会不断改进。
我的问题是:如何正确中断无限循环中的线程?
我已经尝试了一些事情,并决定这样做:
class MyWorker : public QObject
{
Q_OBJECT
public:
MyWorker();
~MyWorker();
public:
ThreadControl * getThreadControl();
public slots:
void work();
private:
void endOfComputation();
private:
ThreadControl * threadControl;
}
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;
};
最后,无限循环被编码为:
void Myworker::work()
{
// ...
forever
{
abort = threadControl->getAbort();
if(abort)
{
break;
}
// ...
}
endOfComputation();
}
然后,你可以猜到,在main,我经常打电话给ThreadControl::setAbort(true)
基本上,我只是在主线程中保留一个指向布尔值的指针,并在需要时切换它。 (布尔值封装在ThreadControl 中,所以我可以用互斥锁正确锁定它)。到目前为止一切顺利,它对我有用......但这对我来说似乎很恶心!切换指向布尔值的指针听起来像......对我来说糟糕的编程......
问题是网络上的文档主要(完全?)关于生产者和消费者线程,它们在有限的时间后完成,而不是在被要求时完成。没有开发中断线程,这就是我问的原因:有更好的方法吗?
【问题讨论】: