Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 首先运行线程,然后运行主进程_C_Multithreading_Pipe - Fatal编程技术网

C 首先运行线程,然后运行主进程

C 首先运行线程,然后运行主进程,c,multithreading,pipe,C,Multithreading,Pipe,我正在Win10 x64上使用VS2010开发管道通信工具。 我使用CreateNamedPipe(L“blablabla”,…)创建了PIPE,这是PIPE-SERVER。然后我使用ConnectNamedPipe(handle)等待PIPE-CLIENT连接 此处出现问题,因为我确信,无法在线传递ConnectNamedPipe(handle)以等待客户端连接。 为了解决这个问题,我刚刚创建了一个线程,等待客户端管道连接 在CreateThread(..)之后,我可以断开该块,并连接到管道服

我正在Win10 x64上使用VS2010开发管道通信工具。
我使用
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_管道\客户端);
}
}
}

无论如何,这是“通用”解决方案。在这种情况下,您可以在启动另一个线程之前在主线程中创建句柄…

非常感谢!你觉得互斥锁怎么样?这意味着,我对信号量不太了解。我认为使用互斥可以实现类似的效果,但对于您尝试在这里执行的“等待信号”操作,它并不是正确的工具。尽管同样,在您的情况下,执行此操作的更简单方法是同步执行安装代码,因为它不像其他线程有什么比同时等待更好的事情要做。。。