对ReadFile堵塞进行异步处理

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

管道的创建读取端:

#include “stdafx.h”
#include
#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;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
管道的连接写入端:

#include “stdafx.h”
#include
#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;

}

————————————————
版权声明:本文为CSDN博主「bangtan辉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bangtanhui/article/details/122122560

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值