我一直在做很多搜索,但似乎无法弄清楚如何解决我的问题。我正在编写一个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。
答案 0 :(得分:2)
看起来像同步代码。使用异步(OVERLAPPED)I / O,在操作完成之前不能使用缓冲区。设置hEvent
结构的OVERLAPPED
成员,并将主循环从PeekMessage
更改为MsgWaitForMultipleObjects
,以便您的程序可以响应I / O事件。然后,您可以等待OVERLAPPED
操作句柄以及进程句柄,以便您知道其他程序何时退出。
答案 1 :(得分:0)
您可能希望查看内存映射文件,您可以在内存中构造一些队列,并从一个地方写入并从另一个地方读取。在我做的一个项目中,我有一个循环队列,其中一个进程写入队列,另一个进程在有时间时读取。
您可以像这样创建一个内存映射文件:
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.nLength = sizeof( sa );
sa.lpSecurityDescriptor = NULL;
hdFile = CreateFileMapping(INVALID_HANDLE_VALUE,&sa,
PAGE_READWRITE,0,dwBufSize, L"SomeName");
然后你得到一个指向这个共享内存的指针
pOutSharedMemory=MapViewOfFile(hdFile,FILE_MAP_ALL_ACCESS,0,0,dwBufSize);
现在你可以将指针映射到内存
e.g。几个计数器,用于跟踪你在内存中的位置(在dwBufSize中)
pdwReadOffset = reinterpret_cast<DWORD*>(pOutSharedMemory)
pdwWriteOffset = pdwReadOffset + sizeof(DWORD)
然后有一些结构,然后使用memmove
读/写到内存你必须使用关键部分等来处理同步。