我现在对QT中的线程感到非常困惑。我读了很多不同的意见,我可以意识到这一点。
我有一个类(计算),它进行繁重的计算并生成大量的解决方案。当本课程找到解决方案时,我会在
的帮助下致电boost::function<void (Solution)> f;
自定义功能。哪个可以与
绑定f = boost::bind( &MainWindow::FoundSolution, this,_1);
不,我在QT中有我的主窗口。我用
打电话给我的课程ComputationsComputations 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和线程的新手。
感谢您的帮助。
答案 0 :(得分:2)
如果从工作线程发出信号,该信号连接到位于ui线程中的对象的插槽,则该插槽将在ui线程中执行。
所以基本上如果你想在QGraphicsView中绘制一个新点,从你的工作线程发送一个信号,传递新点的坐标来绘制。信号需要连接到生活在ui线程中的对象。然后插槽将处理在QGraphicsView中绘制新点,这将在ui线程中执行插槽时起作用。
有关详细信息,请参阅Signals and Slots Across Threads
答案 1 :(得分:0)
答案 2 :(得分:0)
connect( &sender, SIGNAL(), &receiver, SLOT(), Qt::QueuedConnection)
更简单的解决方法是将Qt :: QueuedConnection添加到有问题的插槽连接调用中。