Запустите поток первым, чем основной прогресс - PullRequest
0 голосов
/ 22 января 2019

Я разрабатываю инструмент трубной связи с VS2010 на Win10 x64.
Я создал 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?

1 Ответ

0 голосов
/ 22 января 2019

Для этого вы можете использовать семафор.Что-то вроде псевдокода, у меня нет готового к тестированию компьютера с 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);
        }
    }
}

В любом случае, это «общее» решение.В этом случае вы можете просто создать дескриптор в главном потоке , прежде чем запустит другой поток ...

...