Qt线程等待来自GUI的输入

时间:2012-07-28 12:26:48

标签: c++ multithreading qt

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

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

我的想法:

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

1 个答案:

答案 0 :(得分:3)

第二版的问题出现是因为you are working with Qt thread wrong

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

void stage1Finished();
void stage2Fibished();

和插槽:

void startStage1();
void startStage2();

然后创建Qthread线程对象,将Worker推送到线程,将startStage1()started()线程信号连接,在信号stage1Finished()上显示对话框并连接带有startStage2() dialog-accepted-signal 。将stage2Finishedexit()广告位相关联。

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

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