gpt4 book ai didi

c++ - 从其他线程更新 QT 图形 View

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:58 26 4
gpt4 key购买 nike

我目前对 QT 中的线程感到非常困惑。我读了很多不同的意见,我可以意识到这一点。

我有一个类(计算),它进行大量计算并生成大量解决方案。当此类找到解决方案时,我会在

的帮助下调用
boost::function<void (Solution)> f;

自定义函数。哪个可以绑定(bind)

f = boost::bind( &MainWindow::FoundSolution, this,_1);

不,我在 QT 中有我的主窗口。在那里我称我的类(class)计算为

Computations comp(f); 
QFuture<void> future = QtConcurrent::run(comp,&Computations::DoSomethink);

所以它在我可以使用 GUI 的同时进行计算,并且我在主窗口中获得了对 FoundSolution 函数的新解决方案的响应。在这个函数中,我使用 QGraphicview 来绘制我的解决方案。 Qgraphicsview 是我的主窗口的成员。

这有时有效。

但是我经常会遇到如下错误

Assert failure in QCOREApplication::SendEvent: " cannot send events to objects owend by a different thread. Current thread 438bc40. Receiver " (of type "Qgraphicsscene) was created in thread 15dcc00, file kernel\qcoreapllication line 494

这意味着我从一个不是主线程的线程调用我的 GUI 应用程序,这是 QT 禁止的。但是随着我的提升绑定(bind),我应该在我的主线程中还是?为什么它有时有效?

你知道更好的实现方式吗?我对 QT 和线程真的很陌生。

感谢您的帮助。

最佳答案

如果您从连接到位于 ui 线程中的对象的插槽的工作线程发出信号,则该插槽将在 ui 线程中执行。

所以基本上,如果您想在 QGraphicsView 中绘制一个新点,请从您的工作线程发送一个信号,传入要绘制的新点的坐标。该信号需要连接到位于 ui 线程中的对象。然后槽将处理在 QGraphicsView 中绘制新点,这将起作用,因为槽是在 ui 线程中执行的。

有关详细信息,请参阅 Signals and Slots Across Threads

关于c++ - 从其他线程更新 QT 图形 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com