我正在Win10 x64上使用VS2010开发管道通信工具。
我使用PIPE
创建了CreateNamedPipe(L"blablabla",...)
,它是PIPE - SERVER
。然后,我使用PIPE - CLIENT
等待ConnectNamedPipe(handle)
连接。
由于可以肯定,这里发生的问题无法通过行ConnectNamedPipe(handle)
来等待客户端连接。
为了解决这个问题,我刚刚创建了一个等待客户端管道连接的线程。
在CreateThread(....)
之后,我可以打破障碍,并连接到管道服务器。
这里简单的实现,而不是完整的代码。
DWORD WINAPI _thread_pipe_server_(LPVOID lPvoid)
{
//--------------------------- Step - 01 ---------------------------------
g_pipe_handle = CreateNamedPipe(g_pipe_name,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES, MAX_PIPE_BUFFER_SIZE, MAX_PIPE_BUFFER_SIZE,
g_pipe_time, 0);
if (INVALID_HANDLE_VALUE != g_pipe_handle)
{
ConnectNamedPipe(g_pipe_handle, 0);
// Sending and receiving data...
// --- >
// < ---
DisconnectNamedpipe(g_pipe_handle);
}
return ERROR_PROCESS;
}
int main()
{
HANDLE h_pipe_server = CreateThread(0, 0, _thread_pipe_server_, 0, 0, 0);
if (INVALID_HANDLE_VALUE != h_pipe_server)
{
//--------------------------- Step - 02 ---------------------------------
HANDLE h_pipe_client = CreateFile(g_pipe_name, GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE != h_pipe_client)
{
// Receiving and sending data...
// < ---
// --- >
CloseHandle(h_pipe_client);
}
}
}
正如我所说,我正在使用Win10 x64,并且运行良好。
但是在WIN7上Step - 01
的处理速度不比Step - 02
快。
因此,h_pipe_client
不能为有效值,因为Step - 01
尚未处理。我怎么总是比Step - 01
的父亲Step - 02
跑?
答案 0 :(得分:1)
您可以为此使用信号量。某种伪代码,没有Windows机器可以测试:
DWORD WINAPI _thread_pipe_server_(LPVOID lpSemaphore)
{
// grab the semaphore from the parameter
auto pStep1SemaphoreHandle = static_cast<HANDLE*>(lpSemaphore);
//--------------------------- Step - 01 ---------------------------------
g_pipe_handle = CreateNamedPipe(g_pipe_name,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES, MAX_PIPE_BUFFER_SIZE, MAX_PIPE_BUFFER_SIZE,
g_pipe_time, 0);
// after the pipe is created, signal the semaphore so main thread can continue
ReleaseSemaphore(*pStep1SemaphoreHandle, 1, nullptr);
if (INVALID_HANDLE_VALUE != g_pipe_handle)
{
ConnectNamedPipe(g_pipe_handle, 0);
// Sending and receiving data...
// --- >
// < ---
DisconnectNamedpipe(g_pipe_handle);
}
return ERROR_PROCESS;
}
int main()
{
// semaphore can tell us when something happened in another thread
HANDLE step1Semaphore = CreateSemaphore(NULL, 1, 0, NULL);
HANDLE h_pipe_server = CreateThread(0, 0, _thread_pipe_server_, &step1Semaphore, 0, 0);
// wait until semaphore was signalled
WaitForSingleObject(step1Semaphore, INFINITE);
if (INVALID_HANDLE_VALUE != h_pipe_server)
{
//--------------------------- Step - 02 ---------------------------------
HANDLE h_pipe_client = CreateFile(g_pipe_name, GENERIC_ALL, 0, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE != h_pipe_client)
{
// Receiving and sending data...
// < ---
// --- >
CloseHandle(h_pipe_client);
}
}
}
无论如何,这就是“一般”解决方案。在这种情况下,您可以在启动另一个线程之前在主线程中 创建句柄...