使用Qt线程并在线程之间传递大对象。我只是做错了吗?

时间:2012-02-11 01:00:44

标签: qt

我习惯使用boost_threads并使用我自己滚动的线程安全队列和函数调用将事物连接在一起。然而,Qt的信号和插槽成语似乎对某些东西有帮助,但对其他东西却没有。例如,对于命名管道,以这种方式进行异步通信似乎很棒。

直到我必须将我收到的对象传递给要翻译的命名管道,然后将其发送到另一个线程以转换数据并将其发送出去。

我遇到的最大问题是通过这些来回发送这些消息 信号和插槽机制或者可能使用QMetaObject :: invokeMethod()。似乎这将使用Queued连接发送出来,如果我理解正确,它会复制传递的对象,而不是通过引用或指针传递它。

如果很多事情发生的话,这似乎会变得非常低效。在我的情况下,它将是。我应该采用不同的方式解决这个问题吗?

有没有办法让通过引用或指针在不同的线程中将对象插入队列

2 个答案:

答案 0 :(得分:1)

如果您在进程之间传递,那么您必须复制数据(即在整个进程边界封送它)或将其放在两个进程可以访问的公共位置。您通常可以使用共享内存来执行后者,并且要小心所有权。

答案 1 :(得分:0)

看起来可以传递指针以逃避通过值传递的复制。我还发现建议使用boost :: shared_ptr以便它自己删除。我希望这有助于其他人。