从其他线程更新QT Graphicview

时间:2014-02-18 15:24:01

标签: c++ multithreading qt

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

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

的帮助下致电
boost::function<void (Solution)> f;

自定义功能。哪个可以与

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

不,我在QT中有我的主窗口。我用

打电话给我的课程Computations
Computations comp(f); 
QFuture<void> future = QtConcurrent::run(comp,&Computations::DoSomethink);

所以它计算,而我可以使用GUI,我得到主窗口中FoundSolution功能的新解决方案的响应。在这个函数中,我使用QGraphicview绘制我的解决方案。 Qgraphicsview是我的Mainwindow的成员。

这有时会奏效。

但我经常会收到以下错误

  

在QCOREApplication :: SendEvent中断言失败:“无法向其发送事件   对象由不同的线程所拥有。当前线程438bc40。接收器   “(类型为”Qgraphicsscene“)是在15dcc00文件中创建的   kernel \ qcoreapllication line 494

这意味着我从一个不是主要的线程调用我的GUI应用程序,这是QT禁止的。但是我的提升绑定我应该在我的主线程中?为什么它有时会起作用?

你知道更好的实现吗?我是QT和线程的新手。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

所以基本上如果你想在QGraphicsView中绘制一个新点,从你的工作线程发送一个信号,传递新点的坐标来绘制。信号需要连接到生活在ui线程中的对象。然后插槽将处理在QGraphicsView中绘制新点,这将在ui线程中执行插槽时起作用。

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

答案 1 :(得分:0)

执行此操作的常规方法是使用信号和插槽。您可以在此处找到一些特定于您的问题的文档:Qt 4.8Qt 5

答案 2 :(得分:0)

 connect( &sender, SIGNAL(), &receiver, SLOT(), Qt::QueuedConnection)

更简单的解决方法是将Qt :: QueuedConnection添加到有问题的插槽连接调用中。

相关问题