Создал QThread в main() i.e Основной поток. Переместил рабочий класс в новый поток. Нить выполняет метод «StartThread» рабочего класса.Stop Qt Thread: вызов exit() или quit() не останавливает выполнение потока
Worker Thread:
//header file
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QThread* thread);
public slots:
void StartThread();
void EndThread();
private:
QThread* m_pCurrentThread;
};
// source file
#include "QDebug"
#include "QThread"
#include "worker.h"
Worker::Worker(QThread* thread)
{
m_pCurrentThread = thread;
}
void Worker::StartThread()
{
qDebug() << " StartThread";
while(true)
{
QThread::msleep(1000);
qDebug() << " thread running";
static int count = 0;
count++;
if(count == 10)
{
break;
}
if(m_pCurrentThread->isInterruptionRequested())
{
qDebug() << " is interrupt requested";
// Option 3:
m_pCurrentThread->exit();
}
}
qDebug() << "StartThread finished";
}
void Worker::EndThread()
{
qDebug() << "thread finished";
}
main.cpp
#include <QCoreApplication>
#include "worker.h"
#include "QThread"
#include "QObject"
#include "QDebug"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread* thread = new QThread();
Worker* workerObj = new Worker(thread);
QObject::connect(thread,
SIGNAL(started()),
workerObj,
SLOT(StartThread()));
QObject::connect(thread,
SIGNAL(finished()),
workerObj,
SLOT(EndThread()));
workerObj->moveToThread(thread);
thread->start();
thread->requestInterruption();
QThread::msleep(2000);
qDebug() << "terminate thread";
if(thread->isRunning())
{
// Option 1,2 exit()/quit() used but got same output
thread->exit();
qDebug() << "wait on thread";
thread->wait();
}
qDebug() << " exiting main";
return a.exec();
}
Теперь до завершения 'StartThread' и нить вышла грациозно я хочу, чтобы остановить поток из главного потока. Используется,
- резьбовой> Выход() и ждал (резьбовые> ждать()) в главном потоке.
thread-> quit() и ждал (нить-> подождать()) в главной теме.
выход() в 'StartThread'
Ожидаемое: Казнь поток должен остановиться, как только выход()/выхода() вызывается из главного потока.
Фактический: Во всех трех случаях поток продолжает работать, завершает его метод «StartThread» и выходит изящно. Так же хорошо, как не выходил exit()/quit(). выход:
StartThread
thread running
is interrupt requested
terminate thread
wait on thread
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
is interrupt requested
thread running
StartThread finished
thread finished
exiting main
Можно ли остановить/утилизировать нить, как в случае необходимости в главном потоке?