overlapped I/O的学习,及自定义消息的处理

来源:互联网 发布:开源 php b2c 编辑:程序博客网 时间:2024/04/29 17:33

(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

原创粉丝点击