取代Qt信号槽连接(跨越线程边界)的解决方案?



在Qt中可以:

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

因此,当我将信号从一个线程中的对象连接到另一个线程的对象时,Qt将信号排队,someSlot将在objectInAnotherThread的线程中执行。

这个特殊的功能非常方便和安全,尽管可以复制数据。

C++11中的lambda很方便,但当用纯lambda回调(不带Qt(替换这种连接时,lambda将在调用方的线程中执行。这通常需要互斥等易出错的逻辑来纠正错误。

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

如果出于某种原因我想删除Qt,关于我的信号插槽连接,我有什么替代方案?

旋转线程并将封装的函数调用发送到线程从中提取并执行的队列有什么问题?除了使用"本机"事件循环之外,Qt中的事件队列并不是很特别。不过,不需要这样做,例如QtConcurrent::run线程实现了一个简单的互斥+等待条件保护的队列。每当传递新事件时,线程都会被唤醒并处理它们,直到队列为空。事件可以携带函数调用。事实上,事件可以简单地是std::函数。唯一的症结在于定时器,您必须在等待条件下等待的原语之上实现定时器。这些等待有超时,您可以使用排序的超时队列,并在计时器对象应该"勾选"时安排唤醒。这样做的好处是不会耗尽任何本地定时器,并且可能会表现得更好。

相关内容

最新更新