非阻塞ConnectNamedPipe事件没有得到信号
Non-blocking ConnectNamedPipe event not getting signaled
我从命名管道开始,需要将它们用于两个本地进程之间的IPC。我让服务器和客户端进程都以非阻塞重叠模式使用管道。
一切正常(服务器成功接收客户端发送的字符串),除了通过OVERLAPPED结构传递给ConnectNamedPipe()的事件没有像预期的那样获得信号(当客户端连接时发出信号)。
当服务器被WaitForSingleObject()阻塞时,调用连接到管道的客户端进程,发送其数据并终止,但事件没有得到信号。我错过了什么?
服务器代码:HANDLE hPipe = ::CreateNamedPipeW(
L"\\.\pipe\ThePipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
1,
4096,
4096,
100,
nullptr);
OVERLAPPED ov = {0};
ov.hEvent = ::CreateEventW(nullptr, TRUE, FALSE, nullptr);
BOOL retVal = ::ConnectNamedPipe(hPipe, &ov);
if (retVal == 0)
{
DWORD err = ::GetLastError();
if (err == ERROR_IO_PENDING)
{
::WaitForSingleObject(ov.hEvent, 30000);
}
if (err == ERROR_PIPE_LISTENING)
{
::WaitForSingleObject(ov.hEvent, 30000); // this blocks until time-out???
}
}
您不应该将(已弃用的)PIPE_NOWAIT
与重叠模式一起使用。如果没有客户端连接,PIPE_NOWAIT
使ConnectNamedPipe
立即返回ERROR_PIPE_LISTENING
;重叠的I/O不会发生,等待事件是没有用的。
设置PIPE_NOWAIT
并定期轮询管道直到成功,或者设置FILE_FLAG_OVERLAPPED
并使用事件检查/等待完成。
相关文章:
- C++ 信号和插槽不工作:插槽不响应事件
- 如何监控Qt信号事件队列深度
- 为什么事件队列未处理我的QT信号
- QTimer超时信号在每个超时事件中多次发射
- 为什么在 linux 信号事件中未定义静态成员的使用
- Qt中一个类似事件系统的信号/槽,没有分叉-C++
- 注册以在 MFC 中发出 Win32 事件信号时接收 Windows 消息
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 事件响应比信号量快
- 如何设置并发::事件对象,仅当它现在未处于信号状态时
- 当使用信号处理程序触发事件时,如何使boost.msm正确更改状态
- 如何编写包装类以将 Qt 信号映射到 C# 事件(通过 C++/CLI)
- 从Wt小部件信号事件运行popen()时出现问题
- 在Qt中使用多线程时的事件循环和信号槽处理
- 信号处理程序与虚拟函数和继承(事件处理)
- 信号处理程序与事件处理程序
- 是否可以在Qt3.0中发出跨进程信号或发布触摸/鼠标点击事件
- 在Visual Studio中按下"停止调试"按钮时拦截信号/事件
- C++ 观察者模式侦听器事件方法/类或信号和插槽
- 绘制或渲染QGraphicsView或QWidget时是否存在信号或事件