簡體   English   中英

gui線程為什么不應該住在多線程單元中?

[英]Why shouldn't gui threads live in multithreaded apartments?

COINIT-一種用於指定Windows線程位於單線程還是多線程單元中的枚舉-文檔( http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms678505(v=vs.85) .aspx )指出:

多線程單元旨在供非GUI線程使用。 多線程單元中的線程不應執行UI操作。 這是因為UI線程需要消息泵,而COM不會為多線程單元中的線程泵送消息。

為什么多線程單元中的線程不應該執行UI操作? 在多線程單元中的線程中有消息循環怎么辦? COM是否以某種方式為單線程單元中的線程提供了自動消息循環?

這有些倒退,UI線程主要需要一個消息循環,以便它可以接收來自Windows和其他進程的通知。 消息循環是生產者-消費者問題的通用解決方案。 隨着操作系統和其他進程的產生,UI線程很消耗。

UI線程使用了很多不是線程安全的代碼。 這包括在COM中實現的主要功能,如拖放,剪貼板,外殼對話框,ActiveX控件(如瀏覽器)。 大量的代碼從來沒有成為線程安全的,因為程序員不必這樣做,因此編寫起來容易得多。 這些功能需要STA線程,換句話說,就是通過將COINIT_APARTMENTTHREADED傳遞給CoInitializeEx()來初始化COM的線程。

這是對COM的承諾 ,即線程將成為一個好公民,不允許進行阻塞調用,並且必須啟動消息循環。 COM使用此消息循環封送從工作線程到STA線程的調用,以保持COM對象線程安全。 當所有調用均來自同一線程時,就永遠不會出現安全問題。 底層調用是SendMessage(),具有大量管道將函數參數從一個堆棧復制到另一個堆棧。 CoInitializeEx()創建一個STA線程擁有的隱藏消息窗口,該窗口處理消息並實際進行調用。 安全地

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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