您的位置:首页 >> 编程开发 >> Visual C++ >> 进程和线程 >> 正文
进程和线程 RSS
 

WIN32多线程程序设计学习笔记(第六章 下)

http://www.rdxx.com 06年12月12日 20:22 Blog 我要投稿

继续。。。

上面的程序片段使用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 );

上一页 下一页


 
 
标签: 学习笔记 , 多线程 , 程序设计 , Win32 , 学习 , 程序 , 设计 , 线程 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站