讓Duilib多執行緒程式設計更easy

2021-09-06 21:22:44 字數 1795 閱讀 4927

一、duilib不能開發多執行緒程式?    

記得非常久曾經就聽有人說過duilib的多執行緒支援性不好,原因是duilib裡面的控制項是用陣列管理的全域性變數,不能進行多執行緒訪問,加鎖非常麻煩。事實上這個說法是非常不合理的,以至於在開發多執行緒程式時直接將duilib拒之門外。當然使用duilib裡面開發多執行緒是木有不論什麼問題的,不要單純地覺得:其它的介面庫就能使用多個執行緒同一時候操作乙個控制項,duilib就不行。事實證明,這點mfc做不到,winform也做不到,連微軟自己都搞不定的東西,不能算duilib的缺陷。

二、ui執行緒與工作執行緒

void cmainframe::onfinished(int percent,task*)

在窗體過程處理函式裡面去操作控制項

lresult cmainframe::handlemessage(uint umsg, wparam wparam, lparam lparam)

可是這樣寫是一件十分令人頭疼的事情,要為每個函式都弄乙個自己定義訊息,你不嫌煩編譯器都嫌煩了。

三、skilla為duilib編寫的應用程式框架skillcore,能夠完美勝任多執行緒

duilib儘管在控制項繪製上,花的心思不少。可是在應用程式管理方面卻還在「刀耕火種」的時代,還在使用最原始的winmain。這樣做儘管對使用者透明,可是對於多執行緒程式,不多點花點心思還真是處理不好。就單純乙個析構順序顛倒的問題,就能導致程式崩潰。所以skilla仿照juce的應用程式框架為duilib寫了一套,來解決問題(當然沒有juce裡面那麼複雜了),以下我們來看怎樣使用。 ;

剛才說道非同步呼叫函式,弄自己定義訊息灰常麻煩。為了解決問題,skillcore提供了乙個msgpump的類,用這個物件能夠直接在其它執行緒中使用主線程呼叫函式。以下我們看一下詳細是如何使用的。以下的**是乙個窗體關閉前的乙個「收斂」動作的執行緒動畫,類似於酷狗關閉時的效果。

class windowdestroythread : public thread

~windowdestroythread()

void run()

sleep(10);

} }leaked_the_class(windowdestroythread)

};int windowdestroyanimation(windowdestroythread* t)

else

return 0;

}void cmainframe::notify(tnotifyui& msg)

else if (_tcsicmp(msg.stype,_t("click")) == 0) }

}

使用時,先把須要呼叫的函式,繫結成b_funtion(boost::function)物件,然後使用msgpump的單例物件的callfun函式,去呼叫就可以,第乙個引數傳遞的是繫結好的b_function物件,後面依次是被呼叫函式的引數。眼下最多支援4個引數,假設須要很多其它的話,能夠自己去擴充套件,由於每加乙個引數都須要寫一段反覆性**,skilla已經寫了4個,實在是不願再寫了。

還有裡面封裝了一堆智慧型指標,相信這些應該不用講大家也應該知道怎麼用。有scopeptr自生自滅型別,sharedptr無根強引用型,weakptr無根弱引用型,sharedobjectptr有根強引用型,comsmartptr呼叫com介面用的智慧型指標。

threads裡面還封裝了多執行緒中經常使用到的臨界區,自旋鎖,事件等加鎖機制,使用變得更簡單。

讓Duilib多執行緒程式設計更容易

一 duilib不能開發多執行緒程式?記得很久以前就聽有人說過duilib的多執行緒支援性不好,原因是duilib裡面的控制項是用陣列管理的全域性變數,不能進行多執行緒訪問,加鎖很麻煩。其實這個說法是非常不合理的,以至於在開發多執行緒程式時直接將duilib拒之門外。當然使用duilib裡面開發多執...

多執行緒程式設計

1 多執行緒的基本思路不是在介面執行緒執行費時的 而是專門啟動乙個執行緒 稱作工作執行緒 來完成,介面執行緒只負責介面的 顯示 和操作,而工作執行緒只負責耗時的操作過程。2 對於普通的win32應用程式來說,執行緒可以分為兩種 介面 ui user inte ce 執行緒和工作執行緒。介面執行緒一般...

多執行緒程式設計

如何編寫執行緒安全的dll 在我的工作中經常會編寫dll,這些dll有個共同的特點就是都有乙個初始化函式,乙個資源釋放函式,其他幾個函式都是核心功能函式。而且這些dll有時會被多個程序同時呼叫,這就牽扯到多程序的多執行緒呼叫dll的問題。有點繞口,以下我根據我實踐中遇到的問題,分四種情況分享一下我解...