Qt - 如何杀死QThread

the*_*max 5 qt

我正试图杀死/取消QThread.我跟着https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/的实施

我像这样创建QThread:

workerThread = new QThread();
ImageProcessor* worker = new ImageProcessor();
worker->moveToThread(workerThread);
connect(workerThread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), workerThread, SLOT(quit()));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater()));
workerThread->start();
Run Code Online (Sandbox Code Playgroud)

并尝试通过调用以下方法在某个UI事件上停止它:

workerThread->quit();
Run Code Online (Sandbox Code Playgroud)

我的工人看起来像这样:

class ImageProcessor : public QObject
{
Q_OBJECT
public:
explicit ImageProcessor(QObject *parent = 0);
~ImageProcessor();

signals:
void finished();

public slots:
void process();

private:
//...
};
Run Code Online (Sandbox Code Playgroud)

进程调用具有大量计算的API

void ImageProcessor::process()
{
// API call...

emit finished();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在线程上调用quit后,线程继续运行,即API的计算不会停止.因为worker只调用API,所以我无法在worker循环中使用取消检查.有任何想法吗?

提前致谢!

Ben*_*ela 1

即API的计算不会停止。

所以你试图在计算过程中停止它?

QThread::quit 仅在计算完所有内容后才停止它。

您可以将计算拆分为更小的任务,甚至添加取消标志。在 ImageProcessor 对象上有一个设置它的普通方法:

class ImageProcessor{
   void stop(){
     canceled = true;
   }
private:
   bool canceled;
}
Run Code Online (Sandbox Code Playgroud)

然后检查是否(取消)返回;在进程槽中。(只写布尔值是线程安全的)

然后调用stop(); 在对象上,并在线程上 quit()。