如何中断 Windows 上的选择调用?
我知道这可能是一个基本问题,但我想听听实现它的最佳方法。
那么问题来了。我有一个使用 select 调用的驱动程序线程,并且有一个 GUI 线程,有时需要通过写入同一进程中的某些文件描述符(GUI FD 或其他)来中断 select。我在 UNIX 中使用了管道,但我对 Windows 的套接字没有经验,所以我不确定应该使用哪种 FD。非常感谢示例,但不是必需的)。
谢谢。
I know it's probably a basic question, but I'd like to hear the best way to realize it.
So to the problem. I have a driver thread using a call to select, and I have a GUI thread that needs sometimes to interrupt select by writing to some file descriptor within the same process (GUI FD or something). I used pipe in UNIX, but I'm not experienced in sockets for Windows, so I'm not sure what kind of FD I should use. Example is greatly appreciated but not required ).
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
select()
并不是 Windows 下实现异步 I/O 的最佳选择。不幸的是,Windows 上的select()
调用仅适用于套接字句柄,不适用于管道或 fie 句柄。你应该看看重叠I/O< /a>.
通过在重叠结构中使用事件,您可以获得接近
select()
的行为。套接字上的任何事件都会触发一个事件,您可以使用WaitForMultipleObjects()
等待该事件。现在,您的 GUI 线程可以通过设置使用CreateEvent()
调用创建的特定(单独)事件来向 I/O 线程发出信号。select()
is not the best to implement asynchronous I/O under Windows. unfortunately, theselect()
call on windows only works with socket handles and not with pipe or fie handles.you should have a look at overlapped I/O.
by using an event in your overlapped structure, you can have a behaviour close to
select()
. any event on a socket will trigger an event, which you can wait on by usingWaitForMultipleObjects()
. now, your GUI thread can signal the I/O thread by setting a specific (separate) event, which you create using theCreateEvent()
call.您可以将选择的超时设置得更短,然后如果超时则循环。或者您可以向所选的套接字发送一个简单的数据包,使其唤醒。
You could set the timeout shorter on the select and then loop round if it was a timeout. Or you could send a simple packet to the socket being selected causing it to wake up.