在一个简单的MFC应用程序中,我需要一个工作线程,不断轮询ioctl以查找事件。起初,我试图在while循环中使用非重叠的ioctl来实现这一点。我认为它的方式是,如果ioctl没有立即完成io请求,线程将控制或上下文切换到另一个线程(主线程或MFC消息控制循环),而是锁定应用程序。
在第二次尝试中,我使用了重叠,问题就消失了。但在我看来,这两个方法在行为上是相同的,因为我使用等待事件(io请求完成)触发的WaitForSingleObject。
基本布局如下。请注意,以下代码不完整,只显示构造
同步:
WaitForIo {
do {
DeviceIoControl(hDevice,ioctl_code, ..., NULL);
do something after io request completed
} while(1);
return;
}
异步:
WaitForIo {
do {
Overlapped ov;
//CreateEvent
DeviceIoControl(hDevice,ioctl_code, ..., &ov);
WaitForSingleObject
do something after io request completed
} while(1);
}
为什么这两种方法的表现不同?我的逻辑有什么不对吗?
答案 0 :(得分:0)
如果它锁定线程,则意味着您需要通过使处理器休眠或类似的东西来回馈处理器。 WaitForSingleObject在您调用它时默认执行此操作。我不确定它,但我认为在DeviceIoControl函数中设置null使它等待,同时保持对线程的控制 - 因此锁定线程。