繁体   English   中英

Qt线程计算输出到GUI中自己的窗口小部件?

[英]Qt thread calculations output to own widgets in GUI?

因此,基本上,我要处理的该程序使用Qt中的线程来使用指定数量的线程(最多4个线程)在指定范围内查找所有素数。

每个线程必须输出在其自己的某种GUI小部件中找到的素数。

在提出当前代码时,我跳过了很多基础知识,但到目前为止,除了将数据输出到小部件并将每个线程的数据分离到其自己的小部件中之外,它所做的我上面提到的所有事情。

所以我的问题是..我应该为每个线程的输出使用哪个窗口小部件; 文本小部件/列表小部件等? 而且,通常如何分隔每个线程的“计算”,以便我可以将每个线程输出到其自己的小部件?

除了主线程外,其他线程均不允许直接在GUI窗口小部件对象上调用方法,因为那不是线程安全的(因为主GUI线程也随时可能在窗口小部件上调用方法,例如在重绘时重绘它们)窗口大小发生变化)。

因此,您的计算线程需要向主线程发送一条消息,要求它代表它们更新小部件。

通常最简单的方法是让计算线程发出包含要显示的数据的信号(例如,作为QString),然后通过QueuedConnection将connect()信号发送到相应的小部件的setText()插槽(或一些其他合适的插槽,将更新小部件)。

另一种可能的方法是让窗口小部件线程调用QApplication :: postEvent(theTargetWidget,new MyEventType(myResultData))。 在这种情况下,MyEventType将是您自己的QEvent子类,其中包含要发送到主/ GUI线程的数据。 然后,请确保(theTargetWidget)也是您的子类,在该类中您已经重写了“ bool event(QEvent *)”方法,以检查MyEventType的传入事件,从中提取数据,并使用它。 每当您的计算线程称为postEvent()时,Qt都会确保在主/ GUI线程中尽快将event()称为。

一旦安全地设置了线程间消息传递(通过以上两种方法之一),那么使用哪种类型的QWidget来显示结果就无关紧要了。 任何类型都可以。 (相反,如果您不安全地进行消息传递,则Qt的所有小部件都将无法可靠运行,因为它们都不希望它们的方法被多个线程直接调用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM