2012-05-24 61 views
3

我目前正在重構一箇中等規模的軟件項目。它包含一個由多個線程使用的中央內核類。目前,該類使用Glib::Dispatcher來處理多線程發出的信號。由於重構過程的一個目標是完全擺脫glibmm(因爲Qt將用作新框架),所以我試圖找出如何使用Boost「模擬」調度程序功能的方法。我已經看過Boost.SignalsBoost.Signals2,但這些庫中的任何一個似乎都不能提供調度程序的替代方案。是否有一些用於模擬Glib :: Dispatcher的Boost功能?

爲了澄清什麼,調度員應做的,這裏有一個簡短的描述從the official documentation

油嘴::調度員的工作原理類似於sigc ::信號。但與 正常信號不同,通知通過 管道異步發生。這是一種在線程之間進行通信的簡單高效的方式,並且在具有單個GUI的線程模型中特別有用。

除了操作系統的 內部I/O鎖定之外,不涉及互斥鎖。這意味着一些使用規則:

  • 只有一個線程可以連接到信號並接收通知,但多個 發送者被允許,即使沒有鎖定。
  • GLib主循環必須在接收線程中運行(這通常是GUI線程)。
  • Dispatcher對象必須由接收者線程實例化。
  • 如果您想避免額外鎖定,則應在創建任何發件人線程之前實例化Dispatcher對象。
  • Dispatcher對象必須被接收者線程刪除。
  • 由同一接收者線程實例化的所有分派器對象必須使用相同的主要上下文 上下文。

你能給我一些正確的方向指針嗎?這是我可以使用Boost.SignalsBoost.Signals2實現的功能嗎?

編輯:作爲評論者正確指出,使用Qt也許是一種選擇。但是,我正在重構的類是非常低級的,我不想添加這個額外的依賴項。

+0

Qt有一個信號框架,它完全符合你的需求。有沒有理由不使用它? –

+0

@DavidRodríguez-dribeas是的,要被重構的類是相當低級的,我不想將依賴包括到UI框架中(它可能很容易在將來改變,就像它現在正在改變一樣)。我會在我的問題中提到這一點。 – Gnosophilon

回答

0

我現在選擇了全班重寫有關課程。事實證明,我做而不是需要調度程序的功能,它的方式是由Glib提供。相反,使用正常的boost::signals2信號,加上來自Qt的一些信號用於實際的圖形交互就足夠了。

0

我認爲沒有簡單的方法可以做到這一點,在提升風味的情況下去除Glib並不能解決比其他任何問題更多的構架問題。用Boost替代不會解決設計問題。 你應該爲自己的信號接口建模,並嘗試適應每個庫,包括Glib,因爲它已經在工作,爲問題添加另一個間接級別可以解決這個問題。

如果你看看boost::function,Boost可以幫助你。我不考慮用boost來取代glib是一個真正的進步,boost並不是一個圖形庫,它會在某些時候需要添加一個帶有實現層的接口到你的圖形引擎。

+0

Boost只能替換一些核心功能。正如我在我的問題中寫的,Qt最終會再次處理圖形的東西。然而,對於我所描述的課程,Glib不再是最好的選擇。 – Gnosophilon

相關問題