Как вручную запустить насос сообщений в C ++ - PullRequest
5 голосов
/ 14 июня 2011

ОРИГИНАЛЬНЫЙ ВОПРОС

Наше приложение использует CSocket, для работы которого требуется насос сообщений. В настоящее время нецелесообразно переходить на другую реализацию сокетов, хотя на этом мы бы хотели в какой-то момент оказаться.

Приложение находится в Visual C ++ (НЕ управляется).

В настоящее время мы запускаем C ++ DLL с помощью средства запуска службы C # .NET, которое запускает поток с помощью Application.Run, чтобы запустить насос сообщений, а затем использует DllImport для запуска метода запуска в нашей DLL.

С этим связано множество проблем, наиболее острой из которых является то, что если по какой-либо причине происходит сбой DLL, мы не получаем файл дампа!

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

Я осмотрел Google и несколько вопросов здесь, но часть моей проблемы - это отсутствие базовых знаний C ++, поэтому извиняюсь, если это дурацкий вопрос, если кто-то может указать мне правильное направление, которое было бы очень ценно.

Большое спасибо заранее Мэтт Педдлсден

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Текущий сервис C #, который мы пытаемся заменить, по сути делает это:

public void PumpThread()
{
    DLLStart();
    Application.Run();
}

protected override void OnStart(string[] args)
{
    try
    {
        Thread pumpThread = new Thread(new ThreadStart(PumpThread));
        pumpThread.IsBackground = true;
        pumpThread.Start();
    }
    catch (DllNotFoundException dnfe)
    {
    }
    catch (Exception e)
    {
    }
}

protected override void OnStop()
{
    try
    {
        DLLStop();
    }
    catch (DllNotFoundException dnfe)
    {
    }
    catch (Exception e)
    {
    }
}

По сути, мы просто пытаемся заменить вышеуказанную C # .NET Windows Service на эквивалент C ++, чтобы наш код работал полностью в неуправляемом мире, а не излишне путал это с 5 строками управляемого кода.

DLLStart () и DLLStop () - две функции, импортированные из нашей неуправляемой DLL C +, которые фактически запускают и останавливают систему.

Я не совсем уверен, к какому виду проекта Visual C ++ это нужно, чтобы быть в состоянии что-либо сделать с насосом, если честно.

Надеюсь, что эти дополнительные данные полезны.

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Цикл сообщений в самом простом виде выглядит так:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

но я не уверен, что это действительно отвечает на ваш вопрос - вы не можете просто запустить цикл сообщений, где бы вы ни захотели. Поэтому нам нужно больше деталей.

2 голосов
/ 14 июня 2011

Мой переведенный код C ++ ниже (не проверено:)
PS: вызов DLLStart, DLLStop в том же потоке будет более надежным.

Глобальная переменная содержит идентификатор потока
DWORD threadID = 0;

В эквиваленте OnStart:
CreateThread(0, 0, PumpThread, 0, 0, 0);

В эквиваленте OnStop:
PostThreadMessage(threadID, WM_QUIT, 0, 0);

Процедура потока:

DWORD WINAPI PumpThread(void* param)
{
    threadID = GetCurrentThreadId();  

    DLLStart();  

    // create thread message queue
    PeekMessage(&msg, 0, WM_USER, WM_USER, PM_NOREMOVE);  

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    DLLStop();
}
1 голос
/ 14 июня 2011

Вы должны будете создать поток пользовательского интерфейса.Рабочие темы не имеют сообщения pump

Посмотрите на CWinThread

...