在进行windows编程的时候,创建管道进行读写的时候出现了一些很棘手的问题,而且都是性能上的问题,发出来让大家一起研究啊下:
代码版本一:
BOOL bret=CreatePipe(&hRead, &hWrite, &sa, NULL);
····
bret=CreateProcessW(NULL, (LPTSTR) cmd.c_str(), NULL, NULL,
true, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
····
CloseHandle(hWrite);
WaitForSingleObject(pi.hProcess, 3000);
while (ReadFile(hRead, readBuffer, sizeof(readBuffer)-1, &readnum, NULL))
{
readBuffer[readnum]='\0';
str=str+(LPWSTR)CA2W(readBuffer,CP_UTF8);
}
该无名管道在一般情况下有效能正常使用,但是当单个应用程序实例在CreateProcess后,创建的进程多次对管道读写时,readfile()函数会堵塞。
然后进行了修改为版本2:
BOOL bret=CreatePipe(&hRead, &hWrite, &sa, NULL);
····
bret=CreateProcessW(NULL, (LPTSTR) cmd.c_str(), NULL, NULL,
true, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
····
CloseHandle(hWrite);DWORD Ret = WaitForSingleObject(pi.hProcess, 0);
while (Ret==WAIT_TIMEOUT || Ret==WAIT_OBJECT_0)
{
DWORD bytes=0;
if (PeekNamedPipe(hRead,NULL,0,NULL,&bytes,NULL))
{
if (bytes>0)
{
        DWORD readnum;
if(!ReadFile(hRead, readBuffer, sizeof(readBuffer)-1, &readnum, NULL))
{
break;
}
if (readnum==0)
{
break;
}
readBuffer[readnum]='\0';
str=str+(LPWSTR)CA2W(readBuffer,CP_UTF8);
}
}
if (Ret==WAIT_OBJECT_0)
{
break;
}
Ret = WaitForSingleObject(pi.hProcess, 0);
}
版本2代码成功解决无名管道异步读写的问题,但是在测试中又出现了一个新的问题,在同时打开多个(超过5个以上)应用程序实例同时并都调用CreateProcess后,这些应用程序实例直接都卡死了。
汗,希望大家都发表点看法,现在正在尝试用命名管道去看看能不能解决卡死问题,大家也说说管道方面的一些用法。