Я закончил реализацию программы Go, где человек может прерывать в любое время программное обеспечение, чтобы заказать его для воспроизведения. В принципе, у меня есть алгоритм, работающий в другом потоке, который имеет в любой момент доступный "лучший ход", который он продолжает улучшать.
Мой вопрос: как правильно прервать поток в бесконечном цикле?
Я пробовал несколько вещей и решил сделать это:
class MyWorker : public QObject
{
Q_OBJECT
public:
MyWorker();
~MyWorker();
public:
ThreadControl * getThreadControl();
public slots:
void work();
private:
void endOfComputation();
private:
ThreadControl * threadControl;
}
Обратите внимание, что я не подклассы 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;
};
И, наконец, бесконечный цикл кодируется следующим образом:
void Myworker::work()
{
// ...
forever
{
abort = threadControl->getAbort();
if(abort)
{
break;
}
// ...
}
endOfComputation();
}
Затем, как вы можете догадаться, в main
я регулярно вызываю ThreadControl::setAbort(true)
В основном, я просто сохраняю указатель на логическое в основном потоке, и я переключаю его, когда хочу. (Булево инкапсулировано в ThreadControl
, поэтому я могу правильно заблокировать его с помощью мьютекса). Пока все хорошо, это сработало для меня... Но мне это кажется отвратительным! Переключение указателей на boolean звучит как... плохое программирование для меня...
Проблема заключается в том, что документация в Интернете в основном (полностью?) о потоках производителей и потребителей, которые заканчиваются через некоторое время, а не когда их спрашивают. Прерывание потока не развивается, поэтому я спрашиваю: Есть ли лучший способ?