(1)使用原因
通常的简单系统中,I/O设备处理必然会让主程序停下来干等I/O的完成,对这个问题有两种改进方法:方法一,使用另一个线程进行I/O,这个方案可行,但是麻烦。方法二:使用overlapped I/O。正如书上所说:“overlapped I/O是WIN32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来I/O完成overlapped I/O。”。
(2)怎么样使用overlapped I/O
使用CreateFile ()时,将其第6个参数指定为FILE_FLAG_OVERLAPPED,同时ReadFile()、WriteFile()的第5个参数必须提供一个指针,指向一个OVERLAPPED结构。
(3)实例
以下函数是一个串口接收到数据后的对应处理函数。
OVERLAPPED rOverLaped = {0}; //读数据的OVERLAPPED结构
void CSerialPortDlg::OnReceiveData(WPARAM wParam,LPARAM lParam)
{
DWORD res,factbyte;
memset(DataBufferGet,0,1024);
COMSTAT rst;
ClearCommError(hCom,&res,&rst);
rOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //OVERLAPPED成员赋值
if (ReadFile(hCom,DataBufferGet,rst.cbInQue,&factbyte,&rOverLaped)) //加rOverLaped操作参数
{
DataBufferGet[rst.cbInQue] = 0; //如果读数据成功了,
IsStop = FALSE;
}
else
{
res = WaitForSingleObject(rOverLaped.hEvent,5000); //如果没有马上成功,则等待5S等它读完
}
IsStop = FALSE;
m_receiveinfo.SetWindowText(DataBufferGet);
}
===============================================================================
在VC中,自定义消息需要手工添加,不能通过类向导。
(1)首先定义一个消息代码
#define WM_DEBUG WM_USER + 1999
(2)在窗口头文件中添加
class CStreamServerDlg : public CDialog
{
// Generated message map functions
//}AFX_MSG
afx_msg void OnDebug(WPARAM wParam, LPARAM lParam);
}
(3)在窗口的cpp文件中添加
BEGIN_MESSAGE_MAP(CStreamServerDlg, CDialog)
...
ON_MESSAGE(WM_DEBUG, OnDebug)
END_MESSAGE_MAP()
...
void CStreamServerDlg::OnDebug(WPARAM wParam, LPARAM lParam)
{}
(4)其他地方就可以发送消息
pWnd->PostMessage(WM_DEBUG, (WPARAM)p, 0) )
http://www.builder.com.cn/2007/1016/558779.shtml
http://blog.csdn.net/wallacexiang/archive/2009/07/17/4357296.aspx