1

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

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

我的想法:

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

1 回答 1

3

出现第二个版本的问题是因为您使用 Qt 线程错误

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

void stage1Finished();
void stage2Fibished();

和插槽:

void startStage1();
void startStage2();

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

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

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

于 2012-07-28T14:23:24.187 回答