Я закончил реализацию программы 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
, поэтому я могу правильно заблокировать его мьютексом).Пока все хорошо, это сработало для меня ... Но мне это кажется отвратительным!Переключение указателей на логические значения звучит как ... плохое программирование для меня ...
Проблема в том, что документация в Интернете в основном (целиком?) Касается потоков производителей и потребителей, которые заканчиваются через определенное время, а некогда попросилиПрерывание потока не разработано, поэтому я спрашиваю: Есть ли лучший способ?