在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。
使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。
然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。
响应方式如下:
void CTimeDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1000)//间隔为5秒
{
//处理事件
}
elseif(nIDEvent==1001)//间隔为10秒
{
//处理事件
}
CDialog::OnTimer(nIDEvent);
}
以下是给出一个串口通信定时检查接收数据的部分代码
void CMyDlg::OnOpenCom()
{
//
TODO: Add your control notification handler code here
if
( f_open_com
==
true
)
{
f_open_com
=
false
;
GetDlgItem(IDC_OPEN_COM)
->
SetWindowText(
"
打开通信端口
"
);
CloseHandle(hComm);
KillTimer(
1000
);
///
关闭定时器
return ;
}
SetTimer(
1000
,
1000
,
NULL
);
///
nIDEvent
==
1000
,
time
=
5000ms
const
char
*
ComNo;
DCB dcb;
string
temp(
"
COM1
"
);
ComNo
=
temp.c_str();
hComm
=
CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE ,
0
,
NULL
, OPEN_EXISTING ,
0
,
0
);
if
( hComm
==
INVALID_HANDLE_VALUE )
///
如果端口未打开
{
MessageBox(
"
打开通信端口出错!
"
,
"
Comm Error
"
, MB_OK);
return ;
}
///
将dcb地址传入,以取得通信参数
GetCommState(hComm,
&
dcb);
///
得知目前通信状态
dcb.BaudRate
=
CBR_9600;
dcb.ByteSize
=
8
;
///
字节为8
dcb.Parity
=
NOPARITY;
///
Parity为None
dcb.StopBits
=
ONESTOPBIT;
///
1个停止位
if
( !SetCommState( hComm ,
&
dcb)){
MessageBox(
"
通信端口设置出错!
"
,
"
Set Error
"
, MB_OK );
CloseHandle(hComm);
return;
}
GetDlgItem(IDC_OPEN_COM)
->
SetWindowText(
"
关闭通信端口
"
);
f_open_com
=
true
;
}
void CMyDlg::OnTimer(UINT nIDEvent)
{
//
TODO: Add your message handler code here
and
/
or
call
default
char inbuff[
1024
];
DWORD nBytesRead , dwError;
COMSTAT cs;
///
取得状态
ClearCommError( hComm ,
&
dwError ,
&
cs);
///
数据是否大于所准备的缓冲区
if
( cs.cbInQue
>
sizeof(inbuff) )
{
PurgeComm(hComm , PURGE_RXCLEAR );
///
清除通信端口数据
return ;
}
ReadFile(hComm , inbuff , cs.cbInQue ,
&
nBytesRead ,
NULL
);
//
接收通信端口的数据
inbuff[cs.cbInQue]
=
'
/0';
MessageBox(
"
打开通信端口出错!
"
,
"
Comm Error
"
, MB_OK);
m_Receive.Format(
"
%s
"
,inbuff);
UpdateData(
false
);
CDialog::OnTimer(nIDEvent);
}
http://www.cppblog.com/l-y-p/archive/2008/04/06/46340.html