zoukankan      html  css  js  c++  java
  • 网络编程基础_1.等待句柄

    等待句柄

    #include <stdio.h>
    #include <windows.h>
    
    // 1. 如果想要对一个文件进行异步操作,就必须在打开文件时指定 FILE_FLAG_OVERLAPPED
    // 2. 每次 [投递] 一个异步 IO 操作,都需要提供一个 OVERLAPPED 结构体
    // 3. 当执行的是异步 IO 操作的时候,文件指针就没有作用了,需要使用 OVERLAPPED 设置
    // 4. ReadFile 和 WriteFile 的第 4 个参数,实际操作数量就没有意义了
    // 5. 当使用 FILE_FLAG_OVERLAPPED 打开一个文件时,句柄就拥有了信号状态
    //    - 当 IO 操作完成时,处于有信号状态,使用 WaitForSingleObject 进行判断
    
    
    
    int main()
    {
        // 1. 以重叠 IO 的方式打开一个文件
        HANDLE FileHandle = CreateFile(L"test.txt", GENERIC_ALL,
            NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    
        // 2. 创建并初始化一个重叠 IO 结构体,每次请求都要有独立的结构体
        OVERLAPPED OverLapped = { 0 };
        // 2.1 设置文件操作的偏移位置为 [3]
        OverLapped.Offset = 3;
    
        // 3. 投递一个 IO 请求
        CHAR Buffer[10] = { 0 };
        ReadFile(FileHandle, Buffer, 3, NULL, &OverLapped);
    
        // 4. 等待文件句柄,如果有信号就是说明 IO 请求完成了
        WaitForSingleObject(FileHandle, INFINITE);
    
        // 5. 获取异步 IO 操作的操作状态
        DWORD RealOperator = 0;
        BOOL Result = GetOverlappedResult(
            FileHandle,                // 执行 IO 的句柄
            &OverLapped,            // 对应的重叠 IO 结构体
            &RealOperator,            // 实际读写的数量
            FALSE);                    // 是否等待 IO 操作执行结束
    
        // 最后一个参数表示是都等待 IO 操作完成,如果之前调用了 
        // 等待函数,那么这个字段就没有意义
    
        // 缺点:能够被等待的对象只有一个文件句柄,如果投递了
        // 多个IO操作,那么,并不能区分实际完成的是哪一个。
    
        return 0;
    }
    
    
    // typedef struct _OVERLAPPED {
    //      // 当前绑定的异步 IO 操作是否成功完成
    //       ULONG_PTR Internal;
    // 
    //    // 当前的 IO 操作成功读取或者写入的数量
    //       ULONG_PTR InternalHigh;
    //
    //    // 执行异步 IO 时文件指针所在的位置
    //       union {
    //             struct {
    //                 DWORD Offset;
    //                 DWORD OffsetHigh;
    //             } DUMMYSTRUCTNAME;
    //             PVOID Pointer;
    //       } DUMMYUNIONNAME;
    //       
    //    // 事件对象,在某些时候会用到,可能充当其它角色
    //       HANDLE  hEvent;
    // } OVERLAPPED, * LPOVERLAPPED;
  • 相关阅读:
    make menuconfig出现乱码
    内存中的变量和值
    is&==
    python小整数池
    生成器
    GIL
    grub rescue问题修复
    期末考试
    期末要求
    选课练习
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10945949.html
Copyright © 2011-2022 走看看