这一年来解决的几个故障

来源:互联网 发布:sql中累加函数 编辑:程序博客网 时间:2024/04/28 23:37

这一年来解决的几个故障

(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属性。

原创粉丝点击