我正试图杀死/取消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循环中使用取消检查.有任何想法吗?
提前致谢!
即API的计算不会停止。
所以你试图在计算过程中停止它?
QThread::quit 仅在计算完所有内容后才停止它。
您可以将计算拆分为更小的任务,甚至添加取消标志。在 ImageProcessor 对象上有一个设置它的普通方法:
class ImageProcessor{
void stop(){
canceled = true;
}
private:
bool canceled;
}
Run Code Online (Sandbox Code Playgroud)
然后检查是否(取消)返回;在进程槽中。(只写布尔值是线程安全的)
然后调用stop(); 在对象上,并在线程上 quit()。
| 归档时间: |
|
| 查看次数: |
8671 次 |
| 最近记录: |