c - ReadFileEx/WriteFileEx是否不需要lpCompletionRoutine和使用GetOverlappedResult?

标签 c winapi asynchronous

我想在串行端口上为异步I/O使用ReadFileEx/WriteFileEx函数,而不需要为APC使用lpCompletionRoutine参数。
1-lpCompletionRoutine参数是否可以设置为空?
2-我可以使用GetOverlappedResult并将bWait参数设置为TRUE来阻止直到ReadFileEx/WriteFileEx完成,而不是使用WaitForSingleObjectEx,因为我已经用SetCommTimeouts设置了通信超时!!!???
谢谢你的理解。

最佳答案

调用ReadFileEx时必须提供有效的完成例程,因为如果提供无效地址,程序将在处理APC后立即崩溃。(或者,如果不处理apc,那么存在太多排队I/O完成可能最终导致问题。除此之外,在调用APC之前,您不能合法地重用I/O缓冲区。)
在任何情况下,完成例程都是告诉您I/O已完成的唯一方法。如文档中所述,ReadFileEx函数忽略OVERLAPPED结构的hEvent成员。当然,无论如何,您都可以将事件对象放在hEvent中,并将ReadFileEx指向只设置事件的完成例程。
但是,您最初的前提(使用ReadFileEx将避免同步读取的可能性)是不正确的。确实,在某些情况下,Windows将同步完成名义上的异步I/O操作,但这是由于I/O驱动程序中的限制,并以完全相同的方式影响ReadFileReadFileEx
我不清楚你在评论中说了些什么,你的实际情况是什么,或者你认为是由于意外的同步I/O而遇到了什么问题。串行端口驱动程序可能比大多数驱动程序更容易表现出这种行为,所以这肯定是你的问题的原因,但你需要找到另一个解决方案。例如,您可以使用SetCommMask来检测输入是否可用,并设置超时以使I/O不阻塞,这将使I/O语义与Linux提供的语义相似。
如果你不确定如何继续,我建议你再问一个问题,包括你想达到的目标和到底出了什么问题的细节。

关于c - ReadFileEx/WriteFileEx是否不需要lpCompletionRoutine和使用GetOverlappedResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956862/

相关文章:

c# - Azure ServiceBus 和异步 - 是,还是不是?

c++ - C 和 C++ 编译器的问题

c - 如何模拟按键

c++ - 在注册表中设置 DWORD 值

c# - 如果我想实现这个线程概念,我应该如何使用 TPL?

javascript - Redis Javascript 异步函数

c - 确定字符串是 ANSI C 中的整数还是 float

c++ - 我可以捆绑两个 MPI 消息吗?

delphi - 使用哪个拼写检查器?

c++ - 我怎样才能让我的模板类推断出函数指针模板参数的返回值和参数类型