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

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

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

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

 

我们知道当程序调用I/O设备处理一些事情时,让主程序停下来干等I/O的完成是没有效率的。对这个问题有下面几种解决方法:

方法一:使用另一个线程进行I/O。但从以前的学习中也知道,协调线程间的关系是一件麻烦的事情,需要小心的设计;所以这个方案可行,但是麻烦。

方法二:使用overlapped I/O。正如书上所说:“overlapped I/O是WIN32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来I/O完成overlapped I/O。你可以获得线程的所有利益,而不需付出什么痛苦的代价”。哈!这真是一个好方法!!!

 

下面的内容就是来谈怎样使用overlapped I/O:

 

进行I/O操作时,指定overlapped方式

使用CreateFile(),将其第6个参数指定为FILE_FLAG_OVERLAPPED,就是准备使用overlapped的方式构造或打开文件;如果采用overlapped,那么ReadFile()、WriteFile()的第5个参数必须提供一个指针,指向一个OVERLAPPED结构。OVERLAPPED用于记录了当前正在操作的文件一些相关信息。

//下面引用书上的例子,来说明overlapped

//功能:从指定文件的1500位置读入300个字节

int main()

{

    BOOL rc;

    HANDLE hFile;

    DWORD numread;

    OVERLAPPED overlap;

    char buf[512];

    char szPath=”x:\\xxxx\xxxx”;

    //检查系统,确定是否支持overlapped,(NT以上操作系统支持OVERLAPPED)

    CheckOsVersion();

    // 以overlapped的方式打开文件

    hFile = CreateFile( szPath,

                    GENERIC_READ,

                    FILE_SHARE_READ|FILE_SHARE_WRITE,

                    NULL,

                    OPEN_EXISTING,

                    FILE_FLAG_OVERLAPPED,

                    NULL

                );

    // OVERLAPPED结构实始化为0

memset(&overlap, 0, sizeof(overlap));

//指定文件位置是1500;

    overlap.Offset = 1500;

 

rc = ReadFile(hFile,buf,300,&numread,&overlap);

//因为是overlapped操作,ReadFile会将读文件请求放入读队列之后立即返回(false),

//而不会等到文件读完才返回(true)

    if (rc)

{

//文件真是被读完了,rc为true

      // 或当数据被放入cache中,或操作系统认为它可以很快速地取得数据,rc为true

    }

    else

    {

        if (GetLastError() == ERROR_IO_PENDING)

9 7 3 1 2 3 4 4 8 :

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



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