易语言多线程大漠多线程初始化COM库
一、什么是COM組件
1、COM是Component Object Model (組件對象模型)的縮寫
2、COM組件是以WIN32動態鏈接庫(DLL)或可執行文件(EXE)形式發布的可執行代碼組成。
3、COM組件是遵循COM規范編寫的
4、COM組件必須是動態鏈接的
5、COM組件不是一種計算機語言
6、COM組件不是DLL,只是利用DLL來給組件提供動態鏈接的能力
7、COM組件不是一個API函數集。
8、COM組件不是類,COM 就是一套接口規范,就好象交通規則一樣
9、可以供多種語言調用,跨語言的調用
10、COM中的接口是一組由組件實現的提供給客戶使用的函數。基于二進制接口
《Inside C++ Object Model》
《COM本質論》
《COM+技術內幕》
511遇見易語言多線程大漠多線程
二、認識大漠插件
Dm.dll插件目前是用COM架構設計的,屬于第三方COM對象,要想在我們自己的程序里引用(同進程內調用),需要注冊,或免注冊直接調用。
大漠綜合插件(dm.dll)采用vc6.0編寫,是一款集前后臺,文字識別,圖色,鍵鼠,窗口,內存,DX,Call等功能于一身的綜合插件。主要用于按鍵精靈、簡單游、易語言等輔助制作工具,具有識別速度超級快的特點! 采用COM接口編寫,適用于所有語言調用。
三、初始化COM
1、CoInitialize
CoInitialize是Windows提供的API函數,用來告訴 Windows以單線程的方式創建com對象。
應用程序調用com庫函數(除CoGetMalloc(獲取對默認的OLE任務內存分配器指針)和內存分配函數)之前必須初始化com庫。
多線程里創建COM對象前先初始化,一個線程只調用一次,
CoInitialize(0) dm.創建 ()2、CoInitializeEx
是 Windows提供的API函數,為當前線程初始化COM庫并設置并發模式 。應用程序調用com庫中的函數(除CoGetMalloc和內存分配函數)之前必須初始化com庫。
CoInitializeEx(0,0)函數原型
HRESULT CoInitializeEx( void * pvReserved, DWORD dwCoInit ); <strong class="text-danger"> 參數介紹:</strong> pvReserved 系統 保留的參數,必須傳入 NULL. dwCoInit該標示指明基于當前線程的并發模式和初始化選項。該參數是 COINIT 枚舉類型,傳入參數時候,除了
COINIT_APARTMENTTHREADED 和COINIT_MULTITHREADED標記外,其余的標記可以組合使用。
在應用程序中使用COM庫,至少要調用一次CoInitializeEx函數(通常也就調用一次)。如果傳入參數的并發標志相同,單個線程也可以多次調用該函數
3、CoUninitialize
關閉當前線程的COM庫,卸載線程加載的所有dll,釋放任何其他的資源,關閉在線程上維護所有的連接。
CoInitialize、CoInitializeEx都是windows的API,主要是告訴windows以什么方式為程序創建COM對象。
有哪些方式呢?單線程和多線程。
CoInitialize指明以單線程方式創建。
CoInitializeEx可以指定以多線程方式創建。
創建單線程方式的COM服務器時不用考慮串行化問題,多線程COM服務器就要考慮。
在使用中,使用CoInitialize創建可使對象直接與線程連接,得到最高的性能。
創建多線程對象可以直接接收所有線程的調用,不必像單線程那樣需要消息排隊,但卻需要COM創建線程間匯集代理,這樣訪問效率高。
CoInitialize對windows來說可能只是設置一個標志
CoUninitialize可能只是清除標志。
CoInitialize和CoUninitialize最好在應用程序初始化以及退出時調用,樣例中在構造以及析構中調用是不提倡的做法。
當調用CoUninitialize這個函數的時候,會關掉其所做的線程。那么如果你的應用在運行的時候只有一個進程,而且該進程也僅有一個線程的話,那么調用該函數自然會導致整個應用的退出。
根據線程模型劃分,進程內COM組件分為四類:Single,Apartment,Free,Both
COM套間類型為兩類:STA和MTA,STA是單線程套間,只能運行一個線程,但是一個進程內可以創建多個STA,STA總是與一個線程相關聯,其中第一次創建的STA通常成為主STA(Main STA);MTA是多線程套間,一個進程內只能有一個MTA,但是MTA允許運行多個線程。
一個線程要進入到STA中還是MTA中,是由線程內調用CoInitializeEx函數的第二個參數決定的。
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);進入到STA(相當于調用CoInitialize(NULL);)
CoInitializeEx(NULL, COINIT_MULTITHREADED);進入到MTA
注意:在不再需要的時候,調用CoUninitialize();退出套間,一般CoInitializeEx與CoUninitialize都需要成對調用,以釋放COM占用的資源。
四、CoInitializeEx 與CoInitialize的區別
1、多線程崩潰和使用CoInitialize或CoInitializeEX沒有關系
這里也不能說CoInitializeEX(0,0)更適合易語言,而是更適合高并發。
因為CoInitializeEX內部有鎖機制,效率更慢,而需要用內存換效率。
2、多線程和高并發不是一回事極端高并發下崩潰
3、所以,在某種環境下,兩者是一致的。 而高并發可能讓CoInitialize堵塞了
4、后來的應使用CoInitializeEX,但是調用大量早期的歷史Com庫,是使用的CoInitialize
5、有的時候,高并發崩潰了,真的沒有辦法,因為那超過了機器的處理能力,只能限制。
雖然我們動不動就多線程的說法,但是,實際上我們的CPU常見的也就是4核心。那么真正在運行的也就是4條線程
所以,線程數量,不是越多越好的。切換時間片的時間,都夠執行很多的代碼了。線程多了反而造成了資源的浪費
如果真的需要1400條線程去運行,那你的確需要CoInitializeEX(0,8)確保安全和使用更多的內存
但是,如果只是幾條線程,或者幾十條線程,用CoInitialize可以運行的更快,和少占用資源
MSDN也是推薦CoInitializeEX的,那為啥,還是有人選擇CoInitialize呢,存在即合理的
為什么CoInitialize效率快的,高并發下反而卡死了,占用資源更多呢?
那是因為,他運行的快,無鎖,使用了更多的CPU資源
所以,2個都是可以的,看自己的應用場景取舍。更傾向CoInitialize
但是,如果需要高并發,而客戶機器配置也很強大,也會選擇CoInitializeEX
1、問題的重點是,同一套代碼,用CoInitialize(0)或者CoInitializeEX(0,2)高并發下程序會崩潰,而用CoInitializeEX(0,0)就不會,測試程序的代碼只有幾行,是易語言開發者常用的計算js的方式,是精易模塊里大量使用的方式,不管您認為是代碼問題還是易語言本身問題,用CoInitializeEX(0,0)不崩潰是事實,如果一定要說有錯,那么是否可以說CoInitializeEX(0,0)更適合易語言,更適合易語言開發者?
2、多并發和多線程不是一回事,線程安全跟是否支持高并發也不是一回事
3、匯編那個我之前就看了,他實際上說的是 CoInitializeEX(0,2) 等效于 CoInitialize(0)
4、其它國際化的語言并沒有默認使用CoInitialize(0),恰恰相反的是CoInitializeEX在其他編程語言中運用還是比較廣泛的,CoInitializeEX默認的參數就是CoInitializeEX(0,0),而CoInitialize(0)相當于 CoInitializeEX(0,2)
5、只要windows系統沒有崩潰,黑屏或者藍屏,而程序崩潰了,那必然是有原因的,有沖突的,這個沖突的地方并不難找到,任何崩潰的問題是應該并且可以得到解決的
CoInitialize、CoInitializeEx都是windows的API,主要是告訴windows以什么方式為程序創建COM對象,原因是程序調用com庫函數(除CoGetMalloc和內存分配函數)之前必須初始化com庫。
有哪些方式呢?單線程和多線程。
CoInitialize指明以單線程方式創建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多線程方式創建。
創建單線程方式的COM服務器時不用考慮串行化問題,多線程COM服務器就要考慮。
在使用中,使用CoInitialize創建可使對象直接與線程連接,得到最高的性能。創建多線程對象可以直接接收所有線程的調用,不必像單線程那樣需要消息排隊,但卻需要COM創建線程間匯集代理,這樣訪問效率不高。
五、COM組件注冊
一個COM組件在使用前必須首先注冊
手動注冊
運行 (“regsvr32 ” + 取運行目錄 () + “\dm.dll” + “ -s”, 真, )獲得管理員權限運行batcd /d %~dp0是什么意思啊? 是dos的批處理命令。意思是 更改當前目錄為批處理本身的目錄 有些暈吧?不急,我舉例 比如你有個批處理a.bat在D:\qq文件夾下 a.bat內容為 cd /d %~dp0 在這里 cd /d %~dp0的意思就是cd /d d:\qq %0代表批處理本身 d:\qq\a.bat ~dp是變量擴充 d既是擴充到分區號 d: p就是擴充到路徑 \qq dp就是擴充到分區號路徑 d:\qq源碼:511遇見易語言多線程大漠多線程-20初始化COM庫
總結
以上是生活随笔為你收集整理的易语言多线程大漠多线程初始化COM库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序uniapp获取经纬度、地址
- 下一篇: .net生鲜超市销售系统