生产者/消费者与Qt信号/槽
Producers/consumers with Qt signals/slots
我正在编写一个程序,其中几个生产者生成一些数据,这些数据应该由几个消费者处理。由于每个数据块的消耗大约需要100ms,并且目标平台有许多处理器,因此对我来说,每个生产者和每个消费者都有自己的线程似乎是很自然的。我的问题是:Qt信号/槽是将数据块从生产者传递到消费者的好方法吗?或者你建议一个更好的解决方案(Qt是强烈首选)。
为了以防相关,生产者大约每小时产生数十万个数据。
我不认为信号/插槽机制在这里是合适的,因为每个信号被分配到所有连接的插槽。这意味着如果你使用信号/槽机制作为你的"工作队列",你不会在消费者上得到任何负载分配,而是所有的消费者都做同样的(重复的)工作。
一个更好的机制是使用容器作为工作队列(生产者向容器中添加项目,消费者删除它们),使用QMutex
来避免并发问题,使用一个(或两个,如果你想施加最大大小)QWaitCondition
来阻塞没有工作的消费者。
我建议您避免使用信号和槽,因为它们充当事件,因此一旦发出信号,您就无法控制执行。因此,我建议您使用锁或互斥锁(例如QMutex)来实现互斥。只需使用QMutex类中的锁和解锁方法来保护您的队列。我认为它会比使用信号和槽更快,因为如果你传递对象,它会传递对象的副本,在你传递指针的情况下,你不会保护对象。
欢呼,
相关文章:
- Qt VTK交互风格的信号到小部件
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- Qt将信号与另一个类方法连接
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- Qt:如何通知对象已建立涉及它的信号槽连接
- Qt/C++ 系统单元启动/停止时的信号
- C++Qt信号和插槽
- Qt moveToThread,带有参数的信号/插槽
- 如何在Qt测试框架中对信号进行基准测试?
- Qt - Q_PROPERTY的通知信号未发出有关成员更改的通知信号
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 使用std::bind将Qt信号连接到插槽
- Qt:向死/停止线程发送信号
- 呼叫函数直接与发射信号(QT-信号和插槽)
- 没有这样的插槽/信号(Qt)