取消QTCONCURENT计算

Cancel QtConcurent computation

本文关键字:计算 QTCONCURENT 取消      更新时间:2023-10-16

我想取消事件中的qtconcurent :: map Computation。

这是我的测试代码(计算由无限循环表示):

class Test : public QObject
{
    Q_OBJECT
public:
    Test(QObject *parent=0) : QObject(parent){}
    void test()
    {
        qDebug() << tr("thread:") <<  QThread::currentThread();
        //computation
        while(true);
    }
};

我有测试列表,我做:

//QFuture<void> m_concurentResult;
m_concurentResult = QtConcurrent::map(m_collection, &Test::test);
//That's Ok, I have the two outputs :
//  QThread(0x4e21f8, name = "Thread (pooled)")
//  QThread(0x4e21b8, name = "Thread (pooled)")

目的是在用户单击按钮时取消所有计算。

void Widget::on_pushButton_clicked()
{
    m_concurentResult.cancel();
    m_concurentResult.waitForFinished();
}

但是,当我单击按钮时,UI冻结了,什么也没做。谢谢您的帮助!

除了我要检查cancel是否确实做某事的事实之外(也就是说,如果不实施我不会感到惊讶),您缺少它的意义:它不会取消当前正在运行的任务,但可以防止为该计算安排进一步的任务。

因此,如果您正在处理10个项目(1 .. 10)的地图,并且正在处理项目1和2,并且您调用了CANCAL,则1和2上的持续计算将完成;可能不会处理其他项目(但您对此没有保证)。

通常,问题是您无法轻易取消线程。例如,QT不支持qthreads。

正如Peppe所说,QTConcurrent仅取消进一步处理(如果您通过序列进行映射或过滤)。一个项目不能中断。

这是因为一般无法取消或中断线程。

在C 中,您需要自己管理。(有话要说扩展C ,可能会通过将异常推向线程,在抛出的地方中断/取消线程,但是细节太毛茸茸而无法纳入标准。)

对于某些运行VM(Java,python)的语言,该线程执行Java/Python代码时可行,但在锁定kernel/atnation的操作时却不可行。

>

所以, while(true)应该是 while(!m_interrupted)