mfc中的事件和消息

mfc中的事件和消息,mfc,Mfc,我对mfc中事件和消息之间的区别有点困惑。 它们是一样的吗?如果我们说的是纯Win32,那么它们是不同的: 事件是一种类似于二进制互斥体的内核同步对象。它可以有两种状态:有信号和无信号。它用于同步线程,其中线程获取它(使用WaitForSingleObject或其同类对象)并通过SetEvent API释放它 user32中的窗口管理器使用一条消息通知窗口某些事件,有许多不同的消息用于不同的目的:窗口管理、绘制、用户输入,消息用于窗口之间的通信。事件用于线程之间的同步。更详细一点可能会有用 事件

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

如果我们说的是纯Win32,那么它们是不同的:

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


user32中的窗口管理器使用一条消息通知窗口某些事件,有许多不同的消息用于不同的目的:窗口管理、绘制、用户输入,

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

更详细一点可能会有用

事件优先

因此,您的程序正在运行。然后创建一个事件-要使用的函数调用是CreateEvent()。该事件有两种状态;有信号和无信号。(选择其开始的状态)。您现在可以等待该事件,也就是说,您可以将该事件交给操作系统函数调用,然后等待该事件。当操作系统完成时,它会将事件的状态更改为signaled,您的Wait()函数调用将返回

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

现在是留言


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

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

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

  • WM_命令windows消息的处理程序
  • MFC上的_更新_命令_UI处理程序
  • 用于处理子窗口通知消息的处理程序,如用于处理对话框中的按钮单击的ON_BN_CLICKED
在“消息”下,您可以为其他Windows消息定义消息处理程序

另请参见中的一些解释

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

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


如果您认为这有点混乱,我完全同意…

Dani是正确的:在MFC世界中,“事件”与控件关联,并通过WM_命令消息传递。“消息”是一个涵盖所有windows消息的更广泛的术语。请参阅msdn文档,了解类似示例的内容

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