2010-09-30 73 views
2

我想製作一個簡單的GUI API。從本質上講,它的工作方式是gui widget基本上是一個無限循環中的線程。線程有一個指向小部件類的指針。我希望它的工作方式與WinAPI基本相似。我會這樣做:多線程問題

textbox->SendMessage("Click",args); 

然後將其添加到其隊列進行處理。最終,這將調用一個尖銳的函數,這將是點擊事件處理程序。我希望能夠做的另一件事是安全地獲取和設置類中的東西,而不必擔心工作線程是否正在使用它。例如,如果我在工作人員離職時發送消息(這會增加隊列),這可能會造成麻煩。我正在使用boost :: thread。我應該爲我的情況做些什麼?

感謝

回答

1

你有沒有理由爲了GUI開發而走這條路?

幾乎所有的GUI庫都依賴單個線程來管理'小部件',這是非常好的理由。多線程很難;當用一個大型的暴露界面編寫控件時,你需要非常小心的設計它。隨着線程數量(小部件)的增長,當您接近操作系統的線程限制時,還會遇到可伸縮性問題,否則會增加調度程序的負載,從而導致某些線程開始癱瘓。

我的建議是重新設計一個典型的單線程消息泵,將輸入事件推送到窗口小部件中,並提取它們的結果狀態。

+0

那麼它會適合簡單地有1線程爲我所有的小部件?我正在爲我的遊戲製作這個遊戲,如果讓gui和遊戲渲染在同一個線程上,會更好嗎? – jmasterx 2010-09-30 22:23:56

+1

這個遊戲有多大?這是一個獨立的項目嗎?如果這是一個單獨的遊戲,請專注於使遊戲不是引擎。在一個線程上做所有事情,並專注於制定明確,明確的邊界,以便稍後優化渲染。許多小型團隊(或獨奏)遊戲開發者在努力創造大型引擎基礎設施而不是真正的遊戲時失敗了。如果這是爲了一個更大的項目,或者*純粹是爲了一個API /引擎;使用單獨的線程,渲染到屏幕外的表面,並在呈現線程被標記爲髒時從渲染線程拉出。 – 2010-09-30 22:29:40

+0

關鍵在於:將GUI保留在單個線程上(最好與遊戲處理相同),以便您可以擔心實際編寫小部件而不是調試競態條件。 – 2010-09-30 22:31:14

0

這聽起來很像「活動對象」模式,其中一個對象來運行其自己的私人線程方法的調用。

由於您使用的是C++,因此您可能會發現Herb Sutter的Effective Concurrency article on active objects有用。

+1

你的意思,「這聽起來很像‘活動對象’反模式。 – 2010-09-30 22:06:44

+0

滅火器在準備好了! – 2010-09-30 22:30:51

+0

@克里斯,你只需用瑞恩同意這不是GUI開發一個很好的辦法,或你是否反對一般的「活動對象」模式?你能詳細說明嗎? – 2010-10-01 01:45:13