Можно ли поместить пользовательское сообщение в очередь сообщений win32 в порядке FIFO? - PullRequest
0 голосов
/ 18 ноября 2018

Есть несколько способов, которыми я могу поместить сообщение для потока GUI.

PostMessage : в соответствии с документацией эти сообщения обрабатываются первыми (перед большинством других сообщений). Если я использую это слишком часто, поток GUI может застрять в обработке только моих сообщений и ничего больше (не будет отвечать на клавиатуру \ мышь и т. Д.). Это слишком высокоприоритетный метод.

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

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

То, что я хотел бы попробовать, это поместить некоторое сообщение, которое будет обработано, в том же порядке, что и обычные сообщения. Итак, вот вопрос, как я могу это сделать?


Добавлено:

У меня есть один поток, который готовит видеокадры, и он должен уведомить основной поток (UI) о том, что новый кадр готов, и, возможно, отобразить его. В типичном игровом цикле это будет что-то вроде

  • обрабатывать сообщения до тех пор, пока очередь не станет пустой
  • процесс 1 кадр
  • повтор

Но теперь я не могу контролировать цикл сообщений, потому что он может быть в модальном всплывающем окне или меню.

1 Ответ

0 голосов
/ 18 ноября 2018

Предположим, что ответ «нет» (нет другого способа вставить сообщение). Однако при обработке размещенного сообщения я могу отслеживать прошедшее время и немедленно сигнализировать то же сообщение через WM_TIMER вместо его обработки.

обновление

После некоторого наблюдения кажется, что данное время (1 мс? 5 мс?) Не гарантирует, что ввод будет обработан. Вместо этого работает явная проверка очереди сообщений на входящие сообщения:

case MY_MSG:
{
    MSG msg;
    if(PeekMessage(&msg,0,0,0,PM_NOREMOVE|PM_QS_INPUT))
        SetTimer(hwnd,MY_TIMER,0,0);
    else
        DoWork();
}
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...