[英]call boost signals2 slot on a separate thread
如何在不阻塞發出信號的線程的情況下在單獨的線程上調用 boost 信號 2 插槽? 我想通過 QueuedConnection 參數獲得 Qt5 QObject::connect
的功能; 有關 Qt5 的詳細信息,請參閱Threads 和QObjects 。 也就是說,我需要能夠發出 boost 信號 2 信號,而不能阻塞發出信號的線程; 連接的插槽是從單獨的“事件”線程調用的。
我喜歡 Qt5 API 的功能,但我不能在我的 API 和實現中將 QObject 作為基類和額外的 MOC 機制。 Boost signal2 在其連接處理中是線程安全的,但它在對連接插槽的調用中不是多線程的(實際上我只是在尋找非阻塞)。
我相信將 boost 信號 2 和 asio 作為事件循環的組合可以滿足我的需要,但我不確定如何實現這一點。 另外,我相信其他人也有類似的需求,所以我正在尋找有關如何實現這一目標的想法和建議。
謝謝!
boost::signals2::signal
在發出信號的線程上順序調用槽。 如果您希望實現非阻塞行為,您只需自己在不同的線程上發出信號。
據我了解,Qt QueuedConnection 不僅意味着異步調用插槽,還意味着在接收器特定的線程事件循環中。 這與在任意線程上調用插槽不同。 你的意圖對我來說不是 100% 清楚。
假設您不關心在哪個線程上調用插槽,只要它不阻塞,您就可以將信號包裝在一個小對象中,該對象發布到不同的線程。
一個簡單的例子,使用boost::asio
:
struct async_signal : std::enable_shared_from_this<async_signal>
{
boost::signals2::signal<void(void)> signal;
boost::asio::io_context executor;
void emit_async()
{
boost::asio::post(excutor, [self_weak = weak_from_this()]()
{
if (auto self = self_weak.lock())
{
signal();
}
});
}
}
現在,插槽將在調用 io_context::run() 的任何線程上順序調用。 這通常是某種線程池,例如boost::asio::thread_pool
;
如果您想知道std::enable_shared_from_this
部分,這是為了線程安全。
你當然可以讓這個類模板化並很好地封裝,但我認為這樣更容易理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.