我在Windows7上使用Qt5
在我当前的应用程序中,我有一个类Connector
,我用它连接到一些远程数据库
为了实现这一点,我决定使用QtConcurrent::map
以获得更好的速度
到目前为止还好,但是在尝试使用活动连接(运行线程)退出应用程序时遇到了一些问题。显然,我必须取消它们或等待它们完成,以便优雅地退出应用程序
第一步,我尝试过这样的事情:
void Connector::cancelProcessing()
{
future.cancel();
future.waitForFinished();
}
嗯,它有效,但它的主要缺点是它会冻结GUI
所以,我决定继续前进到下一步:
我实现了一个WaitDialog
,当我退出应用程序时调用它(只是为了向用户显示内容)
如图所示超过1000个单词,好吧......看起来像这样:
没有什么复杂的,它只是等待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) Connector
和QFuture::cancel()
必须始终串联/配对使用?没有QFuture::waitForFinished()
应用程序崩溃,可能有些对象正在进行QFuture::waitForFinished()
或什么?
2)还有其他想法/解决方案可以解决上述问题,除了合作取消之外?
感谢您的时间和耐心!