Qt并发线程:QFuture :: cancel()和" pair" QFuture :: waitForFinished()

时间:2016-03-12 14:10:50

标签: c++ multithreading qt concurrency qtconcurrent

我在Windows7上使用Qt5 在我当前的应用程序中,我有一个类Connector,我用它连接到一些远程数据库 为了实现这一点,我决定使用QtConcurrent::map以获得更好的速度 到目前为止还好,但是在尝试使用活动连接(运行线程)退出应用程序时遇到了一些问题。显然,我必须取消它们或等待它们完成,以便优雅地退出应用程序 第一步,我尝试过这样的事情:

void Connector::cancelProcessing()   
{   
   future.cancel();   
   future.waitForFinished();   
}   

嗯,它有效,但它的主要缺点是它会冻结GUI 所以,我决定继续前进到下一步:
我实现了一个WaitDialog,当我退出应用程序时调用它(只是为了向用户显示内容) 如图所示超过1000个单词,好吧......看起来像这样:
enter image description here

没有什么复杂的,它只是等待finished()信号(来自未来观察者的并发处理)。
预测Close按钮,万一app应用香蕉 我修改了上面的代码:由于waitForFinished呈现WaitDialog无用,我删除了它:

void Connector::cancelProcessing()   
{   
   future.cancel();   
   //future.waitForFinished(); <- removed, so we can see the wait-dialog!  
}   

嗯,在这种情况下,应用程序在退出时可怕地崩溃:(
我知道没有发出finished()信号(由于调用cancel()),但即便如此......即使我在按下{{1}之前等待10,30或60等秒按钮,应用程序仍然崩溃。的为什么

我找到了解决这个问题的一些方法:我只是使用了一些合作取消,即Close类中的变量bool forceQuit,它被设置 - 然后进行测试by threads - 当我想退出app并终止所有线程时。看似琐碎,但pfff ...... 还有什么? :(

无论如何,我仍然对上述问题有2个问题:
1) ConnectorQFuture::cancel()必须始终串联/配对使用?没有QFuture::waitForFinished()应用程序崩溃,可能有些对象正在进行QFuture::waitForFinished()或什么? 2)还有其他想法/解决方案可以解决上述问题,除了合作取消之外?

感谢您的时间和耐心!

0 个答案:

没有答案