окна - отправить сообщение - PullRequest
0 голосов
/ 05 августа 2010

Я вызываю подпрограмму из функции WndProc в приложении для Windows. WndProc вызывался из цикла обработки сообщений при нажатии кнопки. Подпрограмма занимает достаточно много времени для запуска, поэтому она отправляет периодические сообщения с использованием SendMessage (WM_USER). Эти сообщения должны вызывать обновления экрана. К сожалению, все обновления проводятся до тех пор, пока не вернется подпрограмма; в это время все сообщения обрабатываются, а экран обновляется. Обработчик сообщения находится в WndProc; оно делает недействительным окно, которое должно вызвать генерацию сообщения рисования.

Нужно ли запускать подпрограмму как отдельный поток?

Ответы [ 2 ]

0 голосов
/ 05 августа 2010

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

На моем веб-сайте есть введение в рабочие потоки здесь .Когда поток завершает свою работу, вы можете отправить зарегистрированное сообщение обратно в главное окно.Рабочие потоки довольно просты.

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

0 голосов
/ 05 августа 2010

Лучше всего использовать отдельный поток.Но вы также можете запустить цикл обработки сообщений в функции обработчика :

HWND hwnd; 
BOOL fDone; 
MSG msg; 

// Begin the operation and continue until it is complete 
// or until the user clicks the mouse or presses a key. 

fDone = FALSE; 
while (!fDone) 
{ 
    fDone = DoLengthyOperation(); // application-defined function 

    // Remove any messages that may be in the queue. If the 
    // queue contains any mouse or keyboard 
    // messages, end the operation. 

    while (PeekMessage(&msg, hwnd,  0, 0, PM_REMOVE)) 
    { 
        switch(msg.message) 
        { 
            case WM_LBUTTONDOWN: 
            case WM_RBUTTONDOWN: 
            case WM_KEYDOWN: 
                // 
                // Perform any required cleanup. 
                // 
                fDone = TRUE; 
        } 
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...