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
- overlapped I/O的学习,及自定义消息的处理
- overlapped I/O的学习
- overlapped I/O的学习笔记
- Overlapped I/O 学习
- OverLapped I/O Socket 的问题
- overlapped i/o的总结(短小精悍)
- Overlapped I/O 在你的身后变戏法
- Overlapped I/O 在你的身后变戏法
- socket的overlapped(重叠) I\O和其他socket I\O模型的区别
- [转载] Overlapped I/O
- Overlapped I/O
- 设备I/O OVERLAPPED
- Overlapped I/O
- OVERLAPPED I/O
- Overlapped I/O
- Overlapped I/O
- Overlapped I/O
- Overlapped I/O
- PHPCMS 2008中的BASE HREF问题
- Android学习笔记(九):Activity-RelativeLayout
- gwt整合
- 数据库名(DB_NAME)、数据库实例名(Instance_name、ORACLE_SID) 、数据库域名、全局数据库名、数据库服务名 在ORACLE7、8数据库中只有数据库名(db_name)和数据库实例名(instance_name)。
- CALLBACK 回调函数 一个小程序帮助理解回调函数
- overlapped I/O的学习,及自定义消息的处理
- mknod
- 当我还在为开发语言而烦恼的时候,人家已经是专家了。
- CORBA Programming with TAO - 3.IDL Data Type(数据类型与Mapping)
- 给定日期判断周几
- Linux基本概念:终端 zz
- sql2005 和 sql2008 表的 主键 字段 类型 长度 描述
- arm-linux-gcc的用法
- 如何去除被公司IT加锁的手机设置?