這一年來解決的幾個故障

這一年來解決的幾個故障

(1)純英文系統下報警確認("√")的勾爲亂碼

在純英文系統下瀏覽軟件顯示的報警確認的勾爲亂碼.

問題原因:
確認報警標誌字符"√",在英文系統下HL7協議接收確認報警字符串,解析字符"√"錯誤,因而會出現問題。
更改方法:
通過HL7 發送確認報警時,確認的報警將報警字符串中"√"刪除,他牀接收時,確認的報警將在報警字符串頭部加上"√"。


(2)errno問題

           int iValue  = _wtoi( pszCpy );
            if( ERANGE == errno )
            {
                delete []pszCpy;
                pszCpy = NULL;
                return ERROR_TRANS_OVERFLOW;
            }
這種情況下, _wtoi函數轉換正確不會設置errno值(錯誤時會設置)。因爲調用此函數之前,主線程可能已經把errno設置成ERANGE,所以會進入if

條件返回錯誤。

更改方法:
int iValue  = _wtoi( pszCpy ); 之前加上_set_errno(0);,
這樣就保證errno出錯一定是在
int iValue  = _wtoi( pszCpy );
引起的。(errno是線程安全的)

 

(3)COM對象引用計數不正確(IUnknownPtr)
Bed引用計數不正確的原因:
ST回顧組件GetBed()接口獲取Bed對象時沒有將Bed對象的引用計數加1(其他組件相應接口都加1),而在Master組件中的

CBedSetContainerWnd::OnPatientDischarge函數中調用ST回顧組件GetBed()時返回值賦值給一個IUnknownPtr類型的堆棧變量bed,這個過程Bed對象

的引用計數不會增加。但堆棧變量bed(IUnknownPtr類型)在銷燬時會將Bed引用計數減1,這個過程結束後,Bed的引用計數就不正確。所以會導致

Bed對象提前釋放,因而會導致中央站異常退出。

更改方法:
ST回顧組件GetBed()接口獲取Bed對象時將Bed對象的引用計數加1。


(4)ADO-Connection對象Release線程不安全

問題原因:
多線程同時調用Connection對象Release導致異常。
更改方法:
對Connection對象重新封裝一個類,加入Connection對象的Release的調用在各線程之間同步機制。

 

(5)成員變量爲vector注意多線程

for(ColumnVector::iterator it=m_vectorColumn.begin()+1;it!=m_vectorColumn.end();it++)。
由代碼可知單線程情況下是不會出現錯誤的,所以肯定是多線程引起的。
因爲在統計心律失常線程和界面主線程都會對m_vectorColumn操作,所以會引起這個故障。
更改方法:
臨界區,將CHeaderWnd類的m_vectorColumn成員保護起來.統計線程和主線程對m_vectorColumn需要互斥的地方加臨界區保護。

 

(6)COM接口 retval參數屬性問題
GetCurReferenceSTTemplate接口中的pstTemplateDetail參數有retval屬性。
GetCurReferenceSTTemplate將pstTemplateDetail參數用臨時變量緩存、並且沒有初始化(VARIANT類型需要初始化)。如果GetCurReferenceSTTemplate返回值是空,則緩存的臨時變量會有不確定值或者是錯誤值。STUSTTemplateDetail結構體中有VARIANT類型的成員,GetCurReferenceSTTemplate(由於是將結果淺拷貝到stuCurRefDetail)導致將stuCurRefDetail中的成員(VARIANT類型)不確定值。VARIANT類型的成員變量值不確定或者錯誤在後續的VariantCopy或者VariantClear可能出異常。

解決辦法,修改 DataServer的GetCurReferenceSTTemplate接口,去掉retval屬性就可解決。

如果有需要深度拷貝(特別是VARIANT類型)的類型參數,不要使用retval屬性。

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