我有一个QThread可以进行大量计算(它可以运行几分钟),并且在一个(且只有一个)点需要用户输入,例如以是/否对话框的形式。当然,没有GUI元素可以访问,并且没有从线程打开对话框(Qt设计选择),因为它不是主线程。
有很多明显的解决方案,但我对“推荐”解决方案或“最佳实践”感兴趣。
我的想法:
run()
方法?如果run()
退出,则线程将死亡。所以我在我的run()
函数while (!can_continue) { sleep(); }
中有这样的东西,我在插槽中设置can_continue
,我抓住了从主要发送的信号。但是,我对这是最简单/最优雅的解决方案存在疑问。 我应该知道一般的做法吗? 答案 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 。将stage2Finished
与exit()
广告位相关联。
然后您不必在任何地方睡觉,所有信号处理都将通过Qthread
中的标准机制。然后,您只需启动线程即可开始处理,并在处理完成后获得finished
信号。
将信号连接到插槽时,请使用Qt::QueuedConnection
。