c++ - 帮助异步 I/O

标签 c++ winapi asynchronous io pipe

我已经进行了大量搜索,但似乎仍无法弄清楚如何解决我的问题。我正在编写一个 GUI 程序(在 WinAPI 中,所以请不要使用 MFC)来与另一个程序(基于命令行)进行通信。我正在使用匿名管道,因为一切都是本地的(但也许命名管道会更好?)然后我使用 CreateProcess();运行我试图从中获取输出的程序。

现在,几个小时前我刚刚从同步切换到异步,遇到了一些问题(尽管同步并没有按照我的要求进行)。第一个问题是我仍然遇到运行同步 i/o 时遇到的相同问题;如果我多次运行我的“读”(或“写”)函数,程序就会卡住。我不能这样做,因为该程序的目的是定期向 GUI 更新命令提示符的输出。

第二个问题,最终更严重的是我的异步 i/o 的新问题;它不像我的同步那样读取整个输出。它会一直读取,直到我正在读取的程序发送返回字符(否则它恰好停止读取只是巧合)。我觉得我可能没有完全理解 OVERLAP 的功能,但我现在阅读了这么多 MSDN 后感觉陷入了困境,所以我可能忽略了它的一些重要方面。

基本上,下面的代码是我所做工作的最低限度。我曾尝试使用各种 for() 和 while() 循环技术来尝试获取所有输出数据,但似乎行不通。请注意,BUFSIZE 定义在 0x1000,这实际上比我为此需要编写的小测试程序还要多。

    ::ReadFile(_hChild_Out_Rd, chBuf, BUFSIZE, &dwRead, &o1);
chBuf[dwRead] = '\0';
::SetDlgItemTextA(global,IDO_WORLDOUT,chBuf);

那么有人有什么想法吗?

非常感谢您的帮助!

问候,
丹尼斯 M.

最佳答案

这看起来像是同步代码。对于异步 (OVERLAPPED) I/O,您不能在操作完成之前使用缓冲区。设置 OVERLAPPED 结构的 hEvent 成员,并将主循环从 PeekMessage 更改为 MsgWaitForMultipleObjects 以便您的程序可以响应 I/O 事件。然后您可以等待 OVERLAPPED 操作句柄和进程句柄,这样您就可以知道其他程序何时退出。

关于c++ - 帮助异步 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221327/

相关文章:

c++ - 导入的库函数可以在内存中移动吗

c++ - 如何保护两个进程之间共享内存中的字符串?

delphi - 如何使用 WH_CBT Hook 和 WndProc 捕获发送到窗口的所有消息?

c++ - Qt 5 的模型测试?

c++ - join() 是否释放了分配的内存? - C++11 线程

c++ - 如何在结构上使用 extern 关键字

javascript - 我不明白如何使用它或它的作用,来自带有屏幕的 React Native Expo 默认项目的 _loadResourcesAsync

c++ - OBJ 中只有第一个对象有法线

Javascript什么时候回调会被调用,会吗?

c# - 为什么修改数据库数据的查询是可等待的,而只读取数据的查询不是?