取消QTCONCURENT计算
Cancel QtConcurent computation
我想取消事件中的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)
。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 取消QTCONCURENT计算