继续。。。
上面的程序片段使用WaitForMultipleObjects函数来等待,会有两个问题:
第一、 只能等待小于64个的对象,这是WaitForMultipleObjects函数本身所带来的限制。
第二、 你必须不断根据“哪一个handle被激发”而计算如何处理。那个这个程序的结构可不是很清晰,以后维护可不方便
那么书上在这里提供了一个异步过程调用(APCs)的方法来解决这些问题
APCs的核心观点是:提供一个函数,当overlapped I/O操作完成时,自动调用此函数
注意:运用APCs,必须使用ReadFileEx()、WriteFileEx ()
例子:
//自定义函数,供overlapped I/O操作完成时调用
VOID WINAPI MyFunc(DWORD dwErrorCode, //完成码
DWORD dwNumberOfBytesTransfered, // 被传递的字节数目
LPOVERLAPPED lpOverlapped //指向OVERLAPPED 结构的指针
)
{
//这里运用了一个技巧,因为使用APCs技术;那么OVERLAPPED 结构的
//event栏位没有什么用,可以用它来传递一些参数。
//在这里利用它传递序号,以表明是谁完成了overlapped I/O
int nIndex = (int)(lpOverlapped->hEvent);
//针对nIndex,做一些操作
switch ( nIndex )
{
case 1 : //做一些操作。。。 break;
case 2 : //做一些操作。。。 break;
…..
}
//如果所有overlapped I/O都处理完毕,将全局event激发,使主程序结束
if (++nCompletionCount == MAX_REQUESTS)
SetEvent(ghEvent);
}
int main()
{
//构造全局event
ghEvent=CreateEvent(NULL,TRUE,FALSE, NULL );
// 以overlapped的方式打开文件
ghFile = CreateFile( szPath,
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
for (i=0; i<MAX_REQUESTS; i++)
{
//将同一文件按几个部分按overlapped方式同时读
//注意看QueueRequest函数是如何运做的
QueueRequest(i, i*16384, READ_SIZE);
}
// 等待所有操作完成
WaitForSingleObjectEx(ghEvent, INFINITE, TRUE );
上一页 下一页






