- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在串行端口上为异步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驱动程序中的限制,并以完全相同的方式影响ReadFile
和ReadFileEx
。
我不清楚你在评论中说了些什么,你的实际情况是什么,或者你认为是由于意外的同步I/O而遇到了什么问题。串行端口驱动程序可能比大多数驱动程序更容易表现出这种行为,所以这肯定是你的问题的原因,但你需要找到另一个解决方案。例如,您可以使用SetCommMask
来检测输入是否可用,并设置超时以使I/O不阻塞,这将使I/O语义与Linux提供的语义相似。
如果你不确定如何继续,我建议你再问一个问题,包括你想达到的目标和到底出了什么问题的细节。
关于c - ReadFileEx/WriteFileEx是否不需要lpCompletionRoutine和使用GetOverlappedResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956862/
我使用 IO 完成例程通过管道在不同机器上的两个进程之间进行通信。 有时,当调用 WriteFileEx 的完成例程时,完成例程参数 dwErrorCode 为 0(即无错误),GetOverlapp
我正在尝试编写一个非常简单的 C 程序。由于某种原因,我无法在同一程序中使用 writeFileEx 和 receivevfrom,因为每次调用 writeFileEx 都会导致 receivevfr
我正在尝试使用命名管道和重叠 I/O 将数据从 x64 应用程序传递到 x86 应用程序,就像此处定义的那样: http://msdn.microsoft.com/en-us/library/wind
有没有什么方法可以在不创建新线程的情况下使用 APC 完成例程异步读取和写入控制台?就像命名管道一样。 问题是在控制台的情况下,FILE_FLAG_OVERLAPPED 被 CreateFile 函数
我是一名优秀的程序员,十分优秀!