Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将可取消作业卸载到需要更新UI的其他线程_C++_Multithreading_Qt - Fatal编程技术网

C++ 将可取消作业卸载到需要更新UI的其他线程

C++ 将可取消作业卸载到需要更新UI的其他线程,c++,multithreading,qt,C++,Multithreading,Qt,我想将一个函数卸载到另一个线程,因为执行该函数需要很长时间,并且会阻塞主线程(并冻结UI)。以下是代码的简化版本: //当按下按钮时调用此函数,它可以 //可以根据用户需要多次调用。按惯例,打电话 //当作业已在运行时,此函数将取消该操作 //工作,然后开始一个新的工作。 void Data::RefreshData(){ if(future.isRunning()){ 取消数据生成(); future.waitForFinished(); } future=QtConcurrent::run(

我想将一个函数卸载到另一个线程,因为执行该函数需要很长时间,并且会阻塞主线程(并冻结UI)。以下是代码的简化版本:

//当按下按钮时调用此函数,它可以
//可以根据用户需要多次调用。按惯例,打电话
//当作业已在运行时,此函数将取消该操作
//工作,然后开始一个新的工作。
void Data::RefreshData(){
if(future.isRunning()){
取消数据生成();
future.waitForFinished();
}
future=QtConcurrent::run(this,&Data::RegenerateData);
}
我的问题是Data::RegenerateData的一部分工作需要在主线程中运行(UI更新和其他事情)。我将需要在主线程中执行的代码放在另一个函数中,Data::RegeneratData的末尾会发出一个触发此函数的信号。但是,我现在有一个不同的问题:future.waitForFinished()的返回不再意味着完成了整个作业

与其等待future.waitForFinished()完成,我还想等待在主线程中完成的工作。我最初试图用一个等待信号的QEventLoop来实现这一点

void数据::刷新数据(){
if(future.isRunning()){
取消数据生成();
future.waitForFinished();
}
future=QtConcurrent::run(this,&Data::RegenerateData);
}
//在工作线程中运行
无效数据::重新生成数据(){
//长时间运行任务
//正在等待主线程上的工作完成。。。
QEventLoop循环;
连接(此,信号(UpdateFinished()),&循环,插槽(quit());
emit Update();//连接到OnUpdate插槽。
loop.exec();
}
void数据::OnUpdate(){
//更新资料
emit UpdateFinished();
}

这种方法的问题在于它总是会导致死锁。我的方法有什么问题,如何实现我所需要的?

cancelDataGeneration()
也可以发送信号
UpdateFinished()
,否?没有什么可以阻止我这样做。