2012-07-28 28 views
1

我有一个QThread,它执行大量计算(它可以运行几分钟),并且在一个(并且只有一个)点需要用户输入,例如以yes /没有对话框。当然,没有GUI元素可以访问,也没有从线程打开的对话框(Qt设计选项),因为它不是主线程。Qt线程等待来自GUI的输入

那么有很多明显的解决方案,但我对“推荐”解决方案或“最佳实践”感兴趣。

我的想法:

  1. 因为只有一个点的输入必须从GUI读取,我可以有两个线程,被评为对话框后,正在启动第二个线程。问题:它使代码变得不灵活,如果以后我必须引入更多对话框会怎么样?不太可能,但可能会发生。
  2. 我只有一个线程,并在两个方向上与信号和插槽进行通信(我只有“线程到主”形式的信号的经验,而不是相反的方向)。所以线程运行,到了必须做出用户决定的地步,所以线程向main(又名GUI线程)发出一个信号,主要在一个槽中捕获它,创建对话框,评估结果,以及向线程发出信号。现在怎么办?线程捕获一个插槽中的信号,但它应该如何影响正在进行计算的run()方法?如果run()退出,则线程将死亡。所以我在我的run()功能while (!can_continue) { sleep(); }和我设置的can_continue在我抓到从主发送的信号的插槽中有这样的事情。不过,我对这是最简单/最优雅的解决方案有一些怀疑。 我应该知道的一般习惯吗?

回答

3

由于you are working with Qt thread wrong产生了第二个版本的问题。

您应该创建新的对象class Worker: public QObject有信号:

void stage1Finished(); 
void stage2Fibished(); 

和插槽:

void startStage1(); 
void startStage2(); 

然后创建Qthread线程对象,推Worker于螺纹,螺纹的started()信号连接startStage1() ,在信号stage1Finished()上显示对话框并连接对话接受信号startStage2()。连接stage2Finished与线程的exit()插槽。

那么你不必在任何地方睡觉,所有的信号处理都将通过Qthread中的标准机制。然后,您只需启动线程即可开始处理并在处理完成时获取finished信号。

将信号连接到插槽时,请使用Qt::QueuedConnection

+0

您能否详细说明一下?从QThread中派生出来的'Worker'是什么?我是否理解正确,并且是否使用了*原来的工作者线程而不是除此之外?在run()方法中应该存在什么,在run()完成后不要关闭线程。我假设我不应该重写'run()',所以线程不会退出,除非专门调用'exit()'。不仅对我来说,我确信自己正确地理解了这一点,但它对于更多读者也是有用的。 – vsz 2012-07-28 14:42:31

+0

@vsz,请阅读给定的链接。它详细解释了想法。简而言之,你有“原始的”'QThread'对象,并且你有'Worker'对象,将worker对象移动到给定的线程,并且在那之后所有的工作者插槽通过在给定线程的上下文中执行的信号/插槽连接来执行。 – Lol4t0 2012-07-28 14:48:16