我有一个 QThread 可以进行大量计算(它可以运行几分钟),并且在一个(并且只有一个)点需要用户输入,例如以是/否对话框的形式。当然,不能访问任何 GUI 元素,也不能从线程打开任何对话框(Qt 设计选择),因为它不是主线程。
好吧,有许多明显的解决方案,但我对“推荐”解决方案或“最佳实践”感兴趣。
我的想法:
- 因为只有一点必须从 GUI 读取输入,所以我可以有两个线程,第二个线程在评估对话框后启动。问题:它使代码不灵活,如果我以后必须引入更多对话框怎么办?不太可能,但可能会发生。
- 我只有一个线程,并且我在两个方向上都与信号和插槽进行通信(我只有“线程到主线程”形式的信号经验,而不是相反的方向)。所以线程运行,到了必须做出用户决定的地步,所以线程向主线程(也就是 GUI 线程)发出一个信号,主线程在一个槽中捕获它,创建对话框,评估结果,然后向线程发出信号。现在怎么办?线程在槽中捕获信号,但它应该如何影响
run()
正在执行计算的方法?如果run()
退出,则线程死亡。所以我的run()
函数中有这样的东西:while (!can_continue) { sleep(); }
我设置can_continue
在我捕获从主发送的信号的插槽中。但是,我怀疑这是最简单/最优雅的解决方案。有没有我应该知道的一般做法?