【发布时间】:2018-12-14 07:10:13
【问题描述】:
我正在使用异步进程调用 (APC) 来执行使用 ReadFileEx 和 WriteFileEx 的重叠 I/O 请求。正如 MSDN 中所定义的,这些函数的完成例程(APC)只有在定义 APC 的线程处于“alertable”状态时才会被处理。
here 和there 的例子都使用了SleepEx() 函数通过SleepEx(INFINITE, TRUE) 来保持线程的alertable 状态,这样线程就会无限保持alerable 状态直到所有的APCs 完成,这意味着线程暂停,直到所有 APC 完成。这不违反我们使用重叠 I/O、ReadFileEx 和 WriteFileEx 的原因吗?我认为整个想法是使线程响应并在后台花费时间。请帮我解释一下这个想法。
虽然在第一个链接中提到我们可以使用SleepEx(0,TRUE)使线程立即返回并且可以同时处理APC,但我仍然不知道在APC返回之前的这段时间内该怎么办如何知道他们什么时候回来。我的目标只是保持线程响应,但无事可做。
【问题讨论】:
-
这不是处理异步 IO 完成的唯一方法。您可以使用
GetOverLappedResult轮询 IO 的状态,并且可以使用 IO 完成端口来创建反应器/前摄器模式 -
“保持线程响应”是什么意思?线程是做什么的?它是如何分配工作项的?
-
如果你的意思是 ui 线程 - 你需要使用
MsgWaitForMultipleObjectsEx和MWMO_ALERTABLE。有了这个你可以处理windows消息和apc -
@DavidHaim 嗨,我想知道 GetOverlappedResult 在我使用带有完成例程的 Read/WriteFileEx 的情况下可以做什么?谢谢
-
@PeterRuderman 该线程必须在读取和写入文件的同时保持响应并更新进度条。
标签: multithreading asynchronous msdn overlapped-io