Мне нужна помощь по моему приложению, которое я создаю. Это простая программа, которая реагирует на параметры командной строки. Если приложение вызывается впервые, он запускается как конвейерный сервер (блокирующий, неперекрывающийся) в другом потоке, посвященном ему, в то время как основной поток делает что-то еще. Теперь пользователь по-прежнему может вызывать приложение, используя тот же исполняемый файл приложения и параметры командной строки, но поскольку это не первый экземпляр приложения, он передает параметры командной строки первому экземпляру с помощью конвейера, а затем уничтожает сам. Итак, это похоже на одноэлементный процесс в «patterns-lingo».
В идеале это должно быть так:
app.exe "first" // starts app.exe as a pipe server and prints "first"
app.exe "second" // client process causes server instance to print "second"
app.exe "third" // client process causes server instance to print "third"
app.exe "fourth" // client process causes server instance to print "fourth"
app.exe "fifth" // client process causes server instance to print "fifth"
app.exe -quit // client process causes server instance to terminate.
Моя единственная проблема в том, что когда я выполняю указанные выше строки, происходит следующее:
app.exe "first" // starts app.exe as a pipe server and prints "first"
app.exe "second" // client process returns a GetLastError code of 233
app.exe "third" // client process causes server instance to print "third"
app.exe "fourth" // client process returns a GetLastError code of 233
app.exe "fifth" // client process causes server instance to print "fifth"
app.exe -quit // client process returns a GetLastError code of 233
Код моего конвейерного сервера что-то вроде этого (псевдокод):
CreateNamedPipe();
// Code below now runs on a separate thread...
while( !Quit )
{
if( ConnectNamedPipe() is successful )
{
if( PeekNamedPipe() has a message )
{
ReadFile();
ProcessReceivedMessage();
}
FileFlushBuffers();
DisconnectNamedPipe();
}
}
CloseHandle( the pipe );
Моя версия клиента выглядит так (псевдокод):
if( WaitNamedPipe( FOREVER ) != 0 )
{
GetParametersAndFormAMessage();
CreateFile();
WriteFile(); // Sends message to the pipe server
}
CloseHandle();
Согласно MSDN, если сервер использует DisconnectNamedPipe (), клиент будет отключен принудительно и при следующей попытке клиента , они получат ошибку. Как вы думаете, в этом причина? Если да, то как мне отключить клиента, чтобы не возникла дополнительная ошибка? В противном случае, что-нибудь, что я должен знать, чтобы заставить эту работу ??? Потратил много часов, чтобы понять это.