|
http://blog.csdn.net/chenlycly/article/details/7836973 在Windows中,使用SendMessage来发送同步消息,使用PostMessage来发送异步消息。二者的区别在于:SendMessage将消息发给一个窗口,等窗口程序处理完成后才返回;PostMessage则是将消息发到线程的消息队列中,立即返回,不需要等窗口程序处理完成后再返回。SendMessage由于要等到消息被处理后才会返回,所以能保证消息能立即被处理,但可能导致调用函数的“堵塞”;PostMessage由于是将消息放到消息队列中,不能保证消息被立即处理,好处是会立即返回,不会造成函数的拥塞。
一般在回调函数中要使用PostMessage,以保证回调函数的即时执行,从而使回调函数提供者的代码执行不被拥塞。再就是在有的代码中,我们调用系统api实现预定的功能,但api函数内部使用的是,而后续操作需要在api函数起效果后在执行,即要保证消息按先后线性顺序被处理,所以后续操作需要使用PostMessage来处理,以最终实现我们所需要的功能。
http://blog.csdn.net/ithzhang/article/details/8316171
同步设备IO与异步设备IO之异步IO介绍
[cpp] view plaincopy
- typedef struct _OVERLAPPED
-
- {
-
- DWORD Internal;//错误代码。
-
- DWORD InternalHigh;//已传输字节数。
-
- DWORD Offset;//低32位文件偏移。
-
- DWORD OffsetHigh;//高32位文件偏移。
-
- HANDLE hEvent;//事件对象句柄。
-
- }OVERLAPPED,*LPOVERLAPPED;
[cpp] view plaincopy
- #define HasOverlappedIoCompeleted(pOverlapped)\
-
- ((pOverlapped)->Internal!=STATUS_PENDING)
[cpp] view plaincopy
- OVERLAPPED o1={0};
-
- OVERLAPPED o2={0};
-
- BYTE buff[1024];
-
- ReadFile(hFile,buff,100,NULL,&o1);
-
- WriteFile(hFile,buff,100,NULL,&o2);
[cpp] view plaincopy
- VOID ReadData(HANDLE hFile)
-
- {
-
- OVERLAPPED o={0};
-
- BYTE buff[100];
-
- ReadFile(hFile,buff,100,NULL,&o);
-
- }
[cpp] view plaincopy
- BOOL CancelIo(HANDLE hFile);
[cpp] view plaincopy
- BOOL CancelIoEx(HANDLE hFile,LPOVERLAPPED pOverlapped);
[cpp] view plaincopy
- HANDLE hFile=CreateFile(...,FILE_FLAG_OVERLAPPED,...);
-
- BYTE buff[1000];
-
- OVERLAPPED o={0};
-
- o.Offset=345;
-
-
- BOOL bReadDone=ReadFile(hFile,bBuff,100,NULL,&o);//异步则返回false.
-
- DWORD ret=GetLastError();//异步则返回ERROR_IO_PENDIN。
-
- if(!bReadDone&&(ret==ERROR_IO_PENDING))//以异步IO执行。
-
- {
-
- WaitForSingleObject(hFile,INFINITE);
-
- }
[cpp] view plaincopy
- BOOL ReadFileEx(
-
- HANDLE hFile,
-
- PVOID pvBuffer,
-
- DWORD nNumBytesToRead,
-
- OVERLAPPED*pOverlapped,
-
- LPOVERLAPPED_COMPLETION_ROUTINE pfnCompletionRoutine);
-
- BOOL WriteFileEx(
-
- HANDLE hFile,
-
- PVOID pvBuffer,
-
- DWORD nNumBytesToRead,
-
- OVERLAPPED*pOverlapped,
-
- LPOVERLAPPED_COMPLETION_ROUTINE pfnCompletionRoutine);
[cpp] view plaincopy
- VOID WINAPI CompletionRoutine(
-
- DWORD dwError,
-
- DWORD dwNumBytes,
-
- OVERLAPPED*po);
[cpp] view plaincopy
- DWORD SleepEx(
-
- DWORD dwMilliSeconds,
-
- BOOL bAlertable);
-
- DWORD WaitForSingleObjectEx(
-
- HANDLE hObject,
-
- CONST HANDLE*phObjects,
-
- BOOL bWaitAll,
-
- BOOL dwMilliseconds,
-
- BOOL bAlertable);
-
- BOOL GetQueuedCompletionStatusEx(
-
- HANDLE hCompPort,
-
- LPOVERLAPPED_ENTRY pCompPortEntries,
-
- DWORD dwMilliSeconds,
-
- BOOL aAlertable);
-
- BOOL GetQueuedCompletionStatusEx(
-
- HANDLE hCompPort,
-
- LPOVERlAPPEDENTRY pCompPortEntries,
-
- ULONG ulCount,
-
- PULONG pulNumNumEntriesRemoved,
-
- BOOL bAlertable);
-
- DWORD MsgWaitForMultipleObjectEx(
-
- DWORD nCount,
-
- CONST HANDLE *pHandles,
-
- DWORD dwMilliseconds,
-
- DWORD dwWakeMask,
-
- DWORD dwFlags);
[cpp] view plaincopy
- DWORD QueueUserAPC(
-
- PAPCFUNC pfnAPC,
-
- HANDLE hThread,
-
- ULONG_PTR dwData);
[cpp] view plaincopy
- VOID WINAPI APCFUNC(ULONG_PTR dwParam);
[cpp] view plaincopy
- VOID WINAPI APCFunc(ULONG_PTR dwParam)
-
- {}
-
- UINT WINAPI ThreadFunc(PVOID pvParam)
-
- {
-
- HANDLE hEvent=(HANDLE)pvParam;
-
- DWORD dw=WaitForSingleObjectEx(hEvent,INFINITE,true);
-
- if(dw==WAIT_OBJEC_0)//事件内核对象被触发。
- {
-
- }
-
- if(dw==WAIT_IO_COMPLETION)//线程退出。
- {
-
- return 0;
-
- }
-
- }
下一节将会介绍Windows完成端口。
本文参考自《Windows核心编程》第五版第二部分。如有错误,请不吝赐教!!!
2012.12.18 20:52于山西大同 |
|