mfc中的事件和消息

时间:2009-03-29 15:36:09

标签: mfc

我对mfc中事件和消息之间的区别感到有点困惑。 它们是一样的吗?

5 个答案:

答案 0 :(得分:6)

由于您特别询问MFC,我假设您指的是可以在MFC类的属性窗口中定义的事件处理程序和消息处理程序。

在“事件”下,您可以定义:

  • WM_COMMAND窗口消息的处理程序。
  • MFC ON_UPDATE_COMMAND_UI处理程序。
  • 用于子窗口的处理程序通知消息,例如ON_BN_CLICKED,用于处理对话框中的按钮单击。

在“消息”下,您可以为其他Windows消息定义消息处理程序。

另见msdn

中的一些解释

在Win32术语中,事件处理程序和消息处理程序实际上都是消息处理程序。

其他答案解释了Windows事件(与上述MFC“事件”无关)和Windows消息(对应于上述“事件”和“消息”)之间的区别。

如果您认为这有点令人困惑,我完全同意......

答案 1 :(得分:4)

如果我们谈论纯Win32,那么这些是不同的东西:

事件是类似于二进制互斥锁的内核同步对象。它可以有两种状态:发信号但不发信号。它用于同步线程,线程获取它(使用WaitForSingleObject或其表兄弟)并通过SetEvent API释放它。

user32中的窗口管理器使用一条消息来通知某些事件的窗口,有很多不同的消息用于各种目的:窗口管理,绘画,用户输入,......

答案 2 :(得分:4)

消息用于Windows之间的通信。事件用于线程之间的同步

答案 3 :(得分:2)

更多细节可能有用。

事件首先。

所以,你的程序正在运行。然后创建一个事件 - 要使用的函数调用是CreateEvent()。那个事件有两个州;信号和非信号。 (您选择它开始的状态)。您现在可以等待该事件 - 也就是说,您可以将该事件提供给操作系统函数调用,然后等待该事件。操作系统完成后,它会将事件状态更改为已发出信号,并且Wait()函数调用将返回。

现在,如果你只有一个线程,这没用多少 - 你可以调用操作系统函数并等待它返回。但是如果你有多个线程并且想要在它们之间进行通信 - 那么你就不能对其他线程进行函数调用。你做的是与另一个线程通信,告诉它做某事并给它事件,然后等待()直到它完成。

现在,消息。

程序可以拥有所谓的“消息循环”,这是一个阻塞,读取程序消息队列的线程。您可以向线程(或窗口)发送消息,该线程将自动读取该消息。所以一个用途是如果你有多个线程要发出终止消息 - 是时候退出了。另一种方法是让线程知道你希望它做某事 - 并且一条消息可以将两个整数值作为数据,因此你也可以将句柄传递给一个事件,这样线程就可以在完成时发出信号。 (或者您可以在完成后向其发送消息;这完全取决于您希望如何组织代码 - 基于事件或基于消息)。

答案 4 :(得分:1)

Dani是正确的:在MFC世界中,“事件”与控件关联,并通过WM_COMMAND消息传递。 “消息”是一个更广泛的术语,包含所有Windows消息。有关示例,请参阅msdn文档,例如BN_CLICKED

这是令人遗憾的“事件”一词的重载,这是相当混乱的。它与更广泛的Win32世界中的事件无关,它们是内核同步对象。