C 首先运行线程,然后运行主进程
我正在Win10 x64上使用VS2010开发管道通信工具。C 首先运行线程,然后运行主进程,c,multithreading,pipe,C,Multithreading,Pipe,我正在Win10 x64上使用VS2010开发管道通信工具。 我使用CreateNamedPipe(L“blablabla”,…)创建了PIPE,这是PIPE-SERVER。然后我使用ConnectNamedPipe(handle)等待PIPE-CLIENT连接 此处出现问题,因为我确信,无法在线传递ConnectNamedPipe(handle)以等待客户端连接。 为了解决这个问题,我刚刚创建了一个线程,等待客户端管道连接 在CreateThread(..)之后,我可以断开该块,并连接到管道服
我使用
CreateNamedPipe(L“blablabla”,…)
创建了PIPE
,这是PIPE-SERVER
。然后我使用ConnectNamedPipe(handle)
等待PIPE-CLIENT
连接
此处出现问题,因为我确信,无法在线传递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);
}
}
}
DWORD WINAPI(线程)管道(服务器)(LPVOID LPVOID)
{
//---------------------------步骤-01---------------------------------
g_pipe_handle=CreateNamedPipe(g_pipe_name,
管道、通道、双工、,
管道类型字节管道等待,
管道\无限\实例,最大\管道\缓冲区\大小,最大\管道\缓冲区\大小,
g_管_时间,0);
if(无效的\u句柄\u值!=g\u管道\u句柄)
{
连接命名管道(g_管道_手柄,0);
//正在发送和接收数据。。。
// --- >
// < ---
断开名称DPIPE(g U管道U手柄);
}
返回错误处理;
}
int main()
{
HANDLE h_pipe_server=CreateThread(0,0,_thread_pipe_server_u0,0,0);
if(无效的\u句柄\u值!=h\u管道\u服务器)
{
//---------------------------步骤-02---------------------------------
HANDLE h_pipe_client=CreateFile(g_pipe_name,GENERIC_ALL,0,0,OPEN_EXISTING,0,0);
if(无效的\u句柄\u值!=h\u管道\u客户端)
{
//接收和发送数据。。。
// < ---
// --- >
CloseHandle(h_管道\客户端);
}
}
}
正如我所说,我使用的是Win10 x64,它工作得很好。
但是在WIN7上,Step-01
的处理速度并不快于Step-02
因此,
h\u pipe\u client
不能是有效值,因为Step-01
尚未处理。如何始终运行Step-01
而不是Step-02
?您可以使用信号灯进行此操作。一种伪代码,没有准备好测试的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);
}
}
}
DWORD WINAPI(线程)管道(服务器)(LPVOID lpSemaphore)
{
//从参数中获取信号量
auto pStep1SemaphoreHandle=静态广播(lpSemaphore);
//---------------------------步骤-01---------------------------------
g_pipe_handle=CreateNamedPipe(g_pipe_name,
管道、通道、双工、,
管道类型字节管道等待,
管道\无限\实例,最大\管道\缓冲区\大小,最大\管道\缓冲区\大小,
g_管_时间,0);
//创建管道后,向信号量发出信号,以便主线程可以继续
释放信号量(*pstep1semaporehandle,1,nullptr);
if(无效的\u句柄\u值!=g\u管道\u句柄)
{
连接命名管道(g_管道_手柄,0);
//正在发送和接收数据。。。
// --- >
// < ---
断开命名管道(g_管道_手柄);
}
返回错误处理;
}
int main()
{
//信号量可以告诉我们在另一个线程中发生了什么
HANDLE step1Semaphore=CreateSemaphore(NULL,1,0,NULL);
HANDLE h_pipe_server=CreateThread(0,0,_thread_pipe_server,&step1Semaphore,0,0);
//等待信号灯发出信号
WaitForSingleObject(step1Semaphore,无限);
if(无效的\u句柄\u值!=h\u管道\u服务器)
{
//---------------------------步骤-02---------------------------------
HANDLE h_pipe_client=CreateFile(g_pipe_name,GENERIC_ALL,0,0,OPEN_EXISTING,0,0);
if(无效的\u句柄\u值!=h\u管道\u客户端)
{
//接收和发送数据。。。
// < ---
// --- >
CloseHandle(h_管道\客户端);
}
}
}
无论如何,这是“通用”解决方案。在这种情况下,您可以在启动另一个线程之前在主线程中创建句柄…非常感谢!你觉得互斥锁怎么样?这意味着,我对信号量不太了解。我认为使用互斥可以实现类似的效果,但对于您尝试在这里执行的“等待信号”操作,它并不是正确的工具。尽管同样,在您的情况下,执行此操作的更简单方法是同步执行安装代码,因为它不像其他线程有什么比同时等待更好的事情要做。。。