繁体   English   中英

替换 Qt 的信号槽连接(跨线程边界)的解决方案?

[英]Solutions to replace Qt's signal-slot connections (across thread boundaries)?

在 Qt 中,可以:

connect(object, &Object::someSignal, objectInAnotherThread, &Object::someSlot);

因此,当我将来自线程中的 object 的信号连接到另一个线程中的 object 时,Qt 将信号排队,并且 someSlot 将在 objectInAnotherThread 的线程中执行

尽管可以复制数据,但此特定功能非常方便且安全。

C++11 中的 Lambda 很方便,但是当用纯 lambda 回调(没有 Qt)替换这种连接时,lambda的调用者线程将执行。 这通常需要互斥锁等容易出错的逻辑来使事情正确。

我知道Boost::signals2等,但是 AFAIK 在跨线程边界使用时它们不提供类似 Qt 的行为..?

如果出于某种原因我想移除 Qt,我有哪些关于信号槽连接的直接替换选项?

启动线程并将包装的 function 调用发送到线程从中提取并执行的队列有什么问题? Qt 中的事件队列除了使用“本机”事件循环之外并没有什么特别之处。 但是,没有必要这样做,例如 QtConcurrent::run 线程实现了一个简单的互斥+等待条件保护队列。 每当传递新事件时,线程就会被唤醒并处理它们,直到队列为空。 事件可以携带函子调用。 事实上,事件可以简单地是 std::function。 唯一的症结是计时器,您必须在等待等待条件的原语之上实现它。 这些等待有超时,并且您将使用排序的超时队列并在计时器 object 应该“滴答”时安排唤醒。 这样做的好处是不会用完任何本机计时器,并且可能会表现得更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM