分类“工作编程”的存档
在工作中,我需要从CWinThread派生一个界面线程类,专门处理有关Windows套接字的一些相关操作,比如建立、连接、收发、关闭等。程序写完后,发现生成的CAsyncSocket实例不响应连接、接收等消息,百思不得其解。经过仔细跟踪调试,发现原来是我把CAsyncSocket实例过程写在了线程的InitInstance()函数里,而我又在此函数里进行循环等待事件,永远不从此函数返回,除非是要退出线程的时候才返回。见下面的错误代码:
BOOL CMyThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
//创建属于线程的SOCKET*
InitSocketAndBuf();
HANDLE hEvents[3];
hEvents[0] = m_hReConnectEvent; //连接事件
SetEvent(hEvents[0]);//首先进行连接
hEvents[1] = m_hRecvEvent; //接收报文事件
ResetEvent(hEvents[1]);
hEvents[2] = m_hSendEvent; //发送报文事件
ResetEvent(hEvents[2]);
while (1)
{
DWORD dwWait = WaitForMultipleObjects(3,hEvents,FALSE,INFINITE);
if (pApp->m_bExitFlag) break;
switch (dwWait)
{
case WAIT_OBJECT_0:
ReConnectDevice();
ResetEvent(hEvents[0]);
break;
case WAIT_OBJECT_0+1:
ResetEvent(hEvents[1]);
break;
case WAIT_OBJECT_0+2:
ResetEvent(hEvents[2]);
break;
default:
break;
}
}
return FALSE;
}
InitSocketAndBuf()函数就是我实例化Sockets的过程。如果不从此InitInstance()函数返回true,系统控制权尚未交还,就不会继续运行线程的消息循环,因此阻塞了消息传递,所以Sockets的响应消息也就没有了,问题查到。
解决办法如下:
继续阅读…
2008年02月20日 星期三
zmouse
1205次阅读
编程中发现,我按照例子样式写了个实时曲线显示软件,但显示出来的曲线图形是乱的,跟踪调试,传递的数值也是对的,控件怎么会画错图了呢。后来仔细比对,原来用来传递数值的数据类型我使用的是double,而控件只接收float类型。看下面的函数:
PEvsetcellEx(m_hPE, PEP_faYDATA, i, m_nRealTimeCounter, pValue[i][m_nRealTimeCounter]);
数组pValue必须被申明为float才可正常显示。
2008年01月07日 星期一
zmouse
1288次阅读
在定义了一个结构,里面用了字符串类型的话,如下:
typedef struct _DeviceInf
{
int nDeviceId;//装置ID
char chDeviceName[201];//装置名
char chBreakBh[WORDDOC_NAMESTRING_LEN];//开关编号
WORD DetectOffLockCode;//检分锁编码
char chDetectOffBreakBh[WORDDOC_NAMESTRING_LEN];//检分开关编号
WORD DetectOnLockCode;//检合锁编码
char chDetectOnBreakBh[WORDDOC_NAMESTRING_LEN];//检合开关编号
WORD YanDianLockCode;//验电锁编码
char chYanDianBreakBh[WORDDOC_NAMESTRING_LEN];//验电开关编号
int LockTypeID;//锁类型号
}DeviceInf;
如果你申请了一个此结构的变量,如DeviceInf* pDeviceInf =new DeviceInf;。
用此机构变量去比较一个字符串,如if(pDeviceInf->chDetectOffBreakBh != “NULL_STR”),编译的时候是没有语法错误的,而在运行的时候,则会出现此变量pDeviceInf数据被破坏的情况,请注意。要比较字符串应该使用_StrCmp( )函数,或者把pDeviceInf->chDetectOffBreakBh赋值给一个CString变量然后进行比较,这样就没问题了。
2007年12月28日 星期五
zmouse
1223次阅读
近来,工程部反馈nsc200nt v8.0老出现莫名其妙的问题,典型的为如下症状:
1、核心服务程序nssrv在选择启动类型时经常出现崩溃,启动不了。
2、报表制作软件在鼠标移动到右下角的水平滚动条处出现崩溃,退出。
3、报表显示软件在获取数据时,有时出现崩溃退出或者出现不能获取数据。
4、有时候,安装包进行软件安装中,出现错误不能进行安装。
经现场检查,发现机器中了一种auto.exe的病毒,它是通过U盘进行传播的,会在每个驱动器根目录下生成一个autorun.inf和auto.exe文件。动用Windows清理助手ARSwp进行扫描,还发现了另外2个木马病毒,名字我没记住。一并进行清理,清理中提示机器重起,照做便是。经过清理后,上面那些莫名其妙的问题彻底消失。
在此感谢Windows清理助手ARSwp的开发小组,有了他们的无私奉献,才使Windows的世界变的比较清净。
2007年11月29日 星期四
zmouse
1221次阅读
统计类报表包括用电量,设备投退时间,投退次数,负荷率,最大最小值等报表。
下面以制作某断路器某天投入时间(单位:小时)为例。
方法一:(传统方法)
1、把断路器值定义到“设备投切表”中,清零方式选“永不清零”,当然,假如你只需做某小时的统计,则也可以选“按小时清零”,依次类推选“按日清零”、“按月清零”、“按年清零”。
2、把“设备投切表”的“投入累计时间”加入到“一小时采样表”定义中。
3、在报表定义时候,定义二个隐藏点,分别是二个时间的采样值,如D10,D11,然后做公式“=(D11-D10)/3600”(把这二个值相减再除3600)得到这个时间段内断路器投入的小时数。
方法二:
1、如方法一中的第1点。
2、把“设备投切表”的“投入累计时间”加入到“算术差值处理表”定义中。如果需要做一小时的统计,则清零方式选“一小时”,依次类推选“一天”、“一月”、“一年”。
3、在报表定义时候,直接选算术差值采样表中的差值进行定义一个隐藏点D10,然后做公式“=D10/3600”(除3600)得到这个时间段内断路器投入的小时数。
定义时间点说明:
1、月选择 -11~0代表上年的1-12月,13~24代表下年的1-12月;
2、日选择 -30~0代表上月的1-31日,32~62代表下月的1-31日;
3、时选择 -24~-1代表上日的0-23点,24~47代表下日的0-23点。
统计量处理表和算术差值处理表一般是计算的统计值,是对过去发生情况的统计,所以,用它们做报表的时候,我们定义时选择时间点要注意。如要做2日的统计,实际上这个统计结果需要在3日0点以后才会生成。
具体各类型报表定义如下:(统计量处理表和算术差值处理表的清零方式含义一样)
日报:
1、“算术差值处理表”清零方式选“一小时”,分别定义1-24时0分的差值,则表示分别取0-23时的使用量。
2、“算术差值处理表”清零方式选“一天”,定义24时0分的差值,则表示取当天的使用量。
月报:
1、“算术差值处理表”清零方式选“一天”,分别定义1-31日24时0分(或2-32日0时0分)的差值,则表示分别取1-31日每天的使用量。
2、“算术差值处理表”清零方式选“一月”,定义31日24时0分(或32日0时0分)的差值,则表示取当月的使用量。
年报:
1、“算术差值处理表”清零方式选“一月”,分别定义1-12月31日24时0分(或32日0时0分)的差值,则表示分别取1-12月的使用量。
2、“算术差值处理表”清零方式选“一年”,定义12月31日24时0分(或32日0时0分)的差值,则表示取当年的z使用量。
2007年11月14日 星期三
zmouse
1174次阅读
NSC200NT-WEB服务器是电力监控系统的一部分,它允许用户在internet上查看电力系统的实时运行情况以进行决策来安排生产,但不用他们来直接进行控制。假如把服务器直接放在广域网上,则易受攻击,假如它被攻陷后也会影响到电力监控系统。因此必须把服务器放于硬件防火墙后面,并让硬件防火墙只开放必须的端口而屏蔽其它所有非使用端口。
NSC200NT-WEB服务器使用内部网络地址,比如192.168.1.8,internet发布使用的端口80,监控服务程序使用端口是port1。硬件防火墙具有internet上的唯一地址,比如221.222.110.94,此地址在internet上可以直接被访问到。配置防火墙把地址221.222.110.94映射到地址192.168.1.8,把端口80,port1也进行映射,屏蔽所有其它端口。NSC200NT-WEB服务器使用地址192.168.1.8,端口用80进行internet发布。网页配置参数中使用的源IP和连接IP地址均设置为221.222.110.94。这样在internet上的任何人均可在IE地址栏中输入221.222.110.94访问到监控信息。
2007年10月12日 星期五
zmouse
1043次阅读
我用的是Windows 2000 Server 操作系统,因为安装某些软件,导致 SQL Server 2000 中使用企业管理器选择表返回所有行出现错误,提示“不能执行查询,因为一些文件丢失或未注册,请再次运行安装程序确保要求的文件已注册”,但是查询管理器可以正常使用。
经过网络搜索,判断是MDAC出错了。
MDAC是什么?
Microsoft Data Access Components (MDAC) 是一个组件集合,用于在 Microsoft Windows 操作系统上提供数据库连接。MDAC 是一种常用的技术,大多数 Windows 系统上都可能有。默认情况下,MDAC 作为一个组成部分包括在 Windows XP、Windows 2000 和 Windows Millennium Edition(Me) 中。许多其他产品和技术中也包含了或安装了 MDAC。例如,Microsoft Windows NT 4.0 Option Pack和 Microsoft SQL Server 2000 中都有 MDAC;而且,即使未安装 MDAC 本身,Microsoft Internet Explorer 中也包含某些 MDAC 组件。此外,MDAC 还作为一种独立的技术来提供。
MDAC 属于系统组件,不能卸载,只能由更高版本覆盖升级,如单独的MDAC安装包或者操作系统的SERVICE PACK 。
解决方法如下:
继续阅读…
2007年10月11日 星期四
zmouse
887次阅读