对ReadFile堵塞进行异步处理

此前使用ReadFile函数时,都是同步,这样会导致比如说一条管道,一端写入,另一端读取。若写入端出现问题或者写入不成功,读取端会一直堵塞在ReadFile处,程序就一直卡住。因此,考虑使用异步处理,通过一定时间超时判断,如果一直读不到数据就自动向下执行程序。

管道的创建读取端:


#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char buf[100]{0};
	DWORD dwRead, dwLength;
	OVERLAPPED ov;
	ov.Offset = 0;
	ov.OffsetHigh = 0;
	ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	//设置FILE_FLAG_OVERLAPPED
	HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\pipe1", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, 1, 1024, 1024, 0, NULL);

	//先延时一会让另一端打开连接管道
	Sleep(3000);

	DWORD tStart, tCurrent;
	tStart = GetTickCount() / 1000;

	//如果管道另一端写入成功的话,这边立马收到数据并向下执行
	if (!ReadFile(hPipe, buf, 100, &dwRead, &ov))
	{
		//如果管道另一端写入失败的话,这边收不到数据,经过超时后自动退出循环,并向下执行
		while (!GetOverlappedResult(hPipe, &ov, &dwLength, FALSE))
		{
			tCurrent = GetTickCount() / 1000;
			if ((tCurrent - tStart) > 8)
				break;

			Sleep(1000);
		}

	}

	cout << buf << endl;
	system("pause");
	return 0;
}


管道的连接写入端:


#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
		char buf[100]{0};
		DWORD dwWrite;


		WaitNamedPipe("\\\\.\\pipe\\pipe1", NMPWAIT_WAIT_FOREVER);
		HANDLE hPipe = CreateFile("\\\\.\\pipe\\pipe1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (INVALID_HANDLE_VALUE == hPipe){
			cout << "invalid handle" << endl;
		}

		//写入成功的话,管道另一端立马收到数据并向下执行
		//写入失败的话,管道另一端收不到数据,经过超时后自动向下执行
		WriteFile(hPipe, "678gjhs", 8, &dwWrite, 0);

	
		system("pause");
		return 0;
}


`ReadFile` 函数也是 Windows API 中的一个函数,用于从文件或设备读取数据。和 `WriteFile` 函数一样,`ReadFile` 函数也可以实现异步 I/O 操作。 在异步 I/O 操作中,`ReadFile` 函数不会阻塞线程,而是立即返回。当数据读取完成时,操作系统会通知应用程序。为了实现异步 I/O 操作,需要使用 `ReadFile` 函数的重载版本,该函数包含一个指向 `OVERLAPPED` 结构体的指针参数。 `OVERLAPPED` 结构体定义如下: ```c++ typedef struct _OVERLAPPED { ULONG_PTR Internal; ULONG_PTR InternalHigh; union { struct { DWORD Offset; DWORD OffsetHigh; }; PVOID Pointer; }; HANDLE hEvent; } OVERLAPPED, *LPOVERLAPPED; ``` `ReadFile` 函数异步操作流程如下: 1. 创建一个 `OVERLAPPED` 结构体,并设置好相关参数。 2. 调用 `ReadFile` 函数,并传入 `OVERLAPPED` 结构体指针作为最后一个参数。 3. 如果 `ReadFile` 函数返回值为 `FALSE`,则可以通过 `GetLastError` 函数获取错误码。 4. 如果 `ReadFile` 函数返回值为 `TRUE`,则需要等待异步操作完成。可以使用 `GetOverlappedResult` 或者 `WaitForSingleObject` 函数等待异步操作完成,并获取返回值。 需要注意的是,异步 I/O 操作需要使用多线程或者事件通知机制来处理异步操作完成的通知。例如,可以使用 `WaitForSingleObject` 函数等待异步操作完成,并在异步操作完成时设置事件对象,从而通知其他线程操作已完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值