我有一个QThread,它执行大量计算(它可以运行几分钟),并且在一个(并且只有一个)点需要用户输入,例如以yes /没有对话框。当然,没有GUI元素可以访问,也没有从线程打开的对话框(Qt设计选项),因为它不是主线程。Qt线程等待来自GUI的输入
那么有很多明显的解决方案,但我对“推荐”解决方案或“最佳实践”感兴趣。
我的想法:
- 因为只有一个点的输入必须从GUI读取,我可以有两个线程,被评为对话框后,正在启动第二个线程。问题:它使代码变得不灵活,如果以后我必须引入更多对话框会怎么样?不太可能,但可能会发生。
- 我只有一个线程,并在两个方向上与信号和插槽进行通信(我只有“线程到主”形式的信号的经验,而不是相反的方向)。所以线程运行,到了必须做出用户决定的地步,所以线程向main(又名GUI线程)发出一个信号,主要在一个槽中捕获它,创建对话框,评估结果,以及向线程发出信号。现在怎么办?线程捕获一个插槽中的信号,但它应该如何影响正在进行计算的
run()
方法?如果run()
退出,则线程将死亡。所以我在我的run()
功能while (!can_continue) { sleep(); }
和我设置的can_continue
在我抓到从主发送的信号的插槽中有这样的事情。不过,我对这是最简单/最优雅的解决方案有一些怀疑。 我应该知道的一般习惯吗?
您能否详细说明一下?从QThread中派生出来的'Worker'是什么?我是否理解正确,并且是否使用了*原来的工作者线程而不是除此之外?在run()方法中应该存在什么,在run()完成后不要关闭线程。我假设我不应该重写'run()',所以线程不会退出,除非专门调用'exit()'。不仅对我来说,我确信自己正确地理解了这一点,但它对于更多读者也是有用的。 – vsz 2012-07-28 14:42:31
@vsz,请阅读给定的链接。它详细解释了想法。简而言之,你有“原始的”'QThread'对象,并且你有'Worker'对象,将worker对象移动到给定的线程,并且在那之后所有的工作者插槽通过在给定线程的上下文中执行的信号/插槽连接来执行。 – Lol4t0 2012-07-28 14:48:16