я наткнулся на эту проблему, как и другие имущих: QThread won't stop/does not process a signal QThread - Using a slot quit() to exit the threadКакова функция QThread.wait()?
Проблема заключается в том, что я хочу, чтобы рабочий поток начал, делать какую-то работу (которая включает в себя передачу сигналов к другим потокам в моем коде, и прием сигналов асинхронно), а затем выйти. Но я хочу, чтобы этот поток был синхронизирован с кодом, который его запускает. Другими словами, я хочу, чтобы выполнение в коде создало рабочий поток, который должен быть остановлен, пока рабочий поток не выполнит свою работу.
Но, похоже, это невозможно в Qt. Причина в том, что слот рабочего QThread.quit() рабочего не может быть передан из самого потока. Цикл событий, который прослушивает сигналы в этом слоте, должен находиться в том же потоке, который создал рабочий поток. Это означает, что поток создания не должен блокироваться, иначе рабочий поток никогда не останавливается.
Что подводит меня к моему вопросу, что в чем смысл QThread.wait()? Я думаю, что эта функция должна просто застрять в конце программы, чтобы убедиться, что все потоки вышли, но фактически не может использоваться для синхронизации потоков, по крайней мере, она не может использоваться для синхронизации рабочего потока, с созданным потоком Это. Поскольку, если QThread.wait() вызывается из создающего потока, он блокирует свой цикл событий, который блокирует интерфейс рабочего потока, что предотвратит его выход из него.
Я что-то упустил?
Я думал, что мне нужно, чтобы добавить фрагмент кода:
for (auto i = myVector.begin(); i < myVector.end(); ++i)
{
// 5-line best practice creation for the thread
QThread* workerThread = new QThread;
MyWorkerObject* workerObject = new MyWorkerObject(0);
workerObject->moveToThread(workerThread);
QObject::connect(workerThread, SIGNAL(started()), workerObject, SLOT(init()));
QObject::connect(workerThread, SIGNAL(finished()), workerObject, SLOT(deleteLater()));
// Stop mechanism
QObject::connect(workerObject, SIGNAL(finished()), workerThread, SLOT(quit()));
// Start mechanism
wokerThread->start();
// Invoking the work
QMetaObject::invokeMethod(workerObject, "StartYourJob", Qt::QueuedConnection, Q_ARG(SomeType, *i));
// Synchronization
workerThread->wait();
delete wokerThread;
}
'Я хочу, чтобы выполнение в коде, которое создает рабочий поток, должно быть остановлено, пока рабочий поток не выполнит свою работу.' Похоже, что вам не нужен ниток. –
Alex, как я уже упоминал, работа работника «включает отправку сигналов в другие потоки в моем коде и получение сигналов асинхронно». Если я вообще не создаю нить, не будет цикла событий для прослушивания сигналов ... –
'QThread :: wait' необходим для очистки. Он ожидает завершения тайм-аута или потока. Вы не должны удалять объект запуска потока, поскольку он может привести к непредвиденным ошибкам, поэтому перед удалением вы должны называть 'wait (someInterval)' –