一、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多執行緒程式設計更easy
一 duilib不能開發多執行緒程式?記得非常久曾經就聽有人說過duilib的多執行緒支援性不好,原因是duilib裡面的控制項是用陣列管理的全域性變數,不能進行多執行緒訪問,加鎖非常麻煩。事實上這個說法是非常不合理的,以至於在開發多執行緒程式時直接將duilib拒之門外。當然使用duilib裡面開...
共享車位讓城市停車更容易!
現在停車難 停車貴成為了困擾車主出行的大難題,私家車的數量在逐年增長,得益於我國經濟的快速發展,一線城市的停車位缺口更大,停車位緊張,停車難已經成為城市的難題。共享車位的發展是為了緩解城市停車難題,在不增加停車位的基礎上,盤活存量的閒置車位資源,讓停車位充分使用起來,緩解停車位緊張問題,從目前的市場...
如何讓技術想法更容易被理解
1 技術問題描述不清,解決效率低下 同學a在交付現場遇到技術問題,在專案群裡面求助同學b的解決過程。同學a 大佬,雲架構改了之後,資料庫規劃不了。同學a 解決方案導不出來。其他同學cdef 其他問題討論,衝亂了上下文。同學a 資料庫不能規劃,報風險。同學b 先把問題描述清楚。同學a可能的心理狀態 這...