gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:35 27 4
gpt4 key购买 nike

我想在串行端口上为异步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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com