none
Два цикла обработки сообщений. C++ RRS feed

  • Вопрос

  • Здравствуйте. В программе внутри формы располагается два Win32 окна (каждое внутри своей панели), следовательно надо два цикла обработки сообщений, скажите пожалуйста, как второй цикл выбросить в отдельный поток? Или здесь можно придумать что-то получше? Спасибо.
    27 апреля 2015 г. 12:29

Ответы

  • Разумеется. Один из элементов структуры MSG как раз хранит дескриптор окна, которому направляется сообщение, а DispatchMessage направляет сообщение соответствующей функции окна.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 18:34

Все ответы

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

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 12:58
  • Хорошо, а как так тогда обрабатывать сообщения из обоих окон сразу?
    27 апреля 2015 г. 15:06
  • Также, как это делается во всех GUI-приложениях - последовательно.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 15:09
  • Мне пришла в голову мысль, а Вы, случайно не путаете понятия "обработки сообщений" и многопоточности? Программа может исполнять несколько задач одновременно, но поток, управляющий интерфейсом пользователя, должен быть один.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 15:15
  • Вы наверное не понимаете что я хочу сделать: В общем у меня есть форма, на ней помимо прочего есть две панели, на обоих пока просто Win32 окна, но в будущем (когда книгу по DirectX дочитаю) надо наверх ещё и DirectX накатить. Оба окна (с DirectX которые) должны уметь обрабатывать сообщения и без цикла обработки сообщений это никак как я понимаю. Но вот проблема, не могу же в одном потоке сразу 2 цикла крутить, вот я и подумал один цикл в отдельный поток бросить.
    27 апреля 2015 г. 17:16
  • Вы наверное не понимаете что я хочу сделать
    Скорее всего, это Вы не понимаете, чего хотите. DirectX здесь ни причем. Это лишь способ быстрого вывода графики. Что Вы вкладываете в понятие "обработка сообщений"?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 17:40
  • MSG msg = {0};
        while( WM_QUIT != msg.message )
        {
            if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
            {
                Render();
            }
        }

    вот это я вкладываю в понятие "Обработка сообщений".
    27 апреля 2015 г. 17:59
  • Ну, так и рисуйте в обоих окнах в Вашем Render-е. Зачем второй цикл?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 18:02
  • Рендер для примера просто, нужно ведь ещё и сообщения от клавиатуры и мыши обрабатывать. А можно в одном цикле сразу оба окна обрабатывать?
    27 апреля 2015 г. 18:28
  • Рендер для примера просто, нужно ведь ещё и сообщения от клавиатуры и мыши обрабатывать. А можно в одном цикле сразу оба окна обрабатывать?
    Можно иметь только один насос сообщений на процесс и он будет обрабатывать сообщения для всех окон независимо от их числа. Таким образом не только можно, но и нужно. 

    This posting is provided "AS IS" with no warranties, and confers no rights.

    27 апреля 2015 г. 18:34
    Модератор
  • Разумеется. Один из элементов структуры MSG как раз хранит дескриптор окна, которому направляется сообщение, а DispatchMessage направляет сообщение соответствующей функции окна.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 апреля 2015 г. 18:34
  • А, ну тогда вопрос решён. Спасибо.
    27 апреля 2015 г. 18:36
  • вообще-то у каждого потока есть своя очередь сообщений, соответственно циклов может быть несколько

    The system maintains a single system message queue and one thread-specific message queue for each GUI thread.

    https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644927(v=vs.85).aspx

    28 апреля 2015 г. 3:05