События и сообщения в MFC - PullRequest
       10

События и сообщения в MFC

3 голосов
/ 29 марта 2009

Я немного озадачен разницей между событиями и сообщениями в mfc. Они одинаковые?

Ответы [ 5 ]

6 голосов
/ 30 марта 2009

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

Под "событиями" вы можете определить:

  • Обработчики сообщений WM_COMMAND для окон.
  • MFC ON_UPDATE_COMMAND_UI обработчики.
  • Обработчики уведомлений дочерних окон, такие как ON_BN_CLICKED, для обработки нажатия кнопки в диалоговом окне.

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

См. Также некоторые пояснения в msdn

В терминах Win32 и обработчики событий, и обработчики сообщений фактически являются обработчиками сообщений.

Другие ответы объясняют разницу между событиями Windows (не связанными с описанными выше «событиями» MFC) и сообщениями Windows (соответствуют описанным выше «событиям» и «сообщениям»).

Если вы думаете, что это немного сбивает с толку, я полностью согласен ...

4 голосов
/ 29 марта 2009

Сообщения предназначены для связи между окнами. События для синхронизации между потоками.

4 голосов
/ 29 марта 2009

Если мы говорим о чистом Win32, то это разные вещи:

Событие - это объект синхронизации ядра, похожий на двоичный мьютекс. Может иметь два состояния: сигнальное и не сигнализированное. Он используется для синхронизации потоков, когда поток получает его (используя WaitForSingleObject или его двоюродных братьев) и освобождает его через API SetEvent.

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

2 голосов
/ 29 марта 2009

Немного подробнее может быть полезно.

События вначале.

Итак, ваша программа запущена. Затем вы создаете событие - вызов функции для использования - CreateEvent (). Это событие имеет два состояния; сигнализируется и не сигнализируется. (Вы выбираете состояние, в котором оно начинается). Теперь вы можете ждать этого события , то есть вы можете, например, передать это событие вызову функции операционной системы, а затем ждать этого события. Когда операционная система завершит работу, она изменит состояние события на сигнальное, и вызов функции Wait () вернется.

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

Теперь сообщения.

Программа может иметь так называемый «цикл сообщений», который представляет собой поток, который блокирует чтение очереди сообщений программы. Вы можете отправить сообщение в поток (или окно), и оно будет автоматически прочитано этим потоком. Таким образом, одно из применений: если у вас есть несколько потоков, это выдать сообщение о завершении - пора выйти. Другой способ - сообщить потоку, что вы хотите, чтобы он что-то сделал - и сообщение может принимать два целочисленных значения в качестве данных, так что вы также можете передать указатель на событие, чтобы поток мог сигнализировать вам, когда это будет сделано. (Или вы можете сделать так, чтобы он отправлял вам сообщение, когда все готово; все зависит от того, как вы хотите организовать свой код - на основе событий или сообщений).

1 голос
/ 30 марта 2009

Дани прав: в мире MFC «событие» связано с элементом управления и передается через сообщение WM_COMMAND. «Сообщение» - это более широкий термин, охватывающий все сообщения Windows. См. Документацию msdn, например, BN_CLICKED .

Это прискорбная перегрузка термина «событие», что довольно запутанно. Это не имеет ничего общего с событиями в более широком мире Win32, которые являются объектами синхронизации ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...