CoUninitialize掛起


    最近遇到一個比較詭異的故障.現象是這樣的:進行長時間運行程序退不出來(經過測試大概大於6分鐘) ,短時間一切正常(小於6分鐘)。最後經過打日誌等手段,在退出時執行到CoUninitialize時掛起(短時間運行是正常的)。本來以爲是COM對象應用的不正確,釋放時出問題,這個程序比較小,普查了一遍也沒有發現什麼問題。最後在網上找到一個談到COM庫6分鐘的一個故障,我也就把這個歸結爲COM庫的故障了。
  這個故障大概是樣的,遠程COM之間交互式每2分鐘PING一次,超過3次沒有回覆就認爲對方斷掉,就回收資源。而對方因爲忙在這6分鐘內沒有回覆,但對方還認爲客戶端在,在回收資源(CoUninitialize)就會掛起,具體細節的仔細研究COM機制才能弄清楚。
   因爲這個程序是有一個主線程創建單線程套件,還有一個工作線程也創建單線程套件,主線程通過消息通知工作線程工作內容,工作線程將工作進度和結果通過消息通知主線程。兩個線程都有消息循環,工作線程的消息循環是在COM單線程套件中。
  最後解決辦法是將工作線程的消息循環放到套件外面,就可以解決了。本來是想要交換一下主線程和工作線程的COM服務器和客戶端的角色。可能是因爲消息循環原因。等以後有時間再將原理搞清楚,先解決了再說。
  在項目開發過程中會有很多意想不到的風險的,有些是系統的故障,或則應用不合理導致的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章