在main()即主线程中创建了一个QThread.
将一个worker类移动到新线程.该线程执行worker类的’StartThread’方法.
工人线程:
//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
#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-> exit()
并在主线程中等待(thread-> wait()).
> thread-> quit()
并在主线程中等待(thread-> wait()).
>’StartThread’中的exit()
预期:
一旦从主线程调用exit()/ quit(),线程执行就应该停止.
实际:
在所有三个实例中,线程一直在运行,完成’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
是否可以在主线程需要时停止/处理线程?