簡體   English   中英

在單獨的線程上調用 boost 信號 2 插槽

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM