【发布时间】:2017-03-06 16:43:27
【问题描述】:
我对 mfc 中事件和消息之间的区别有点困惑。 它们是一样的吗?
【问题讨论】:
标签: mfc
我对 mfc 中事件和消息之间的区别有点困惑。 它们是一样的吗?
【问题讨论】:
标签: mfc
由于您专门询问 MFC,我假设您指的是可以在 MFC 类的属性窗口中定义的事件处理程序和消息处理程序。
在“事件”下,您可以定义:
在“消息”下,您可以为其他 Windows 消息定义消息处理程序。
另见msdn中的一些解释
在 Win32 术语中,事件处理程序和消息处理程序实际上都是消息处理程序。
其他答案解释了 Windows 事件(与上述 MFC“事件”无关)和 Windows 消息(对应于上述“事件”和“消息”)之间的区别。
如果您认为这有点令人困惑,我完全同意...
【讨论】:
消息用于窗口之间的通信。事件用于线程之间的同步。
【讨论】:
如果我们谈论的是纯 Win32,那么这些是不同的东西:
事件是一个内核同步对象,有点像二进制互斥锁。它可以有两种状态:已发出信号和未发出信号。它用于同步线程,线程获取它(使用 WaitForSingleObject 或其表亲)并通过 SetEvent API 释放它。
user32 中的窗口管理器使用消息来通知窗口某些事件,有很多不同的消息用于各种目的:窗口管理、绘画、用户输入……
【讨论】:
更多细节可能有用。
事件优先。
所以,您的程序正在运行。然后您创建一个事件 - 要使用的函数调用是 CreateEvent()。该事件有两种状态;有信号的和无信号的。 (您选择它开始的状态)。您现在可以等待该事件 - 也就是说,例如,您可以将该事件提供给操作系统函数调用,然后等待该事件。操作系统完成后,它会将事件的状态更改为已发出信号,并且您的 Wait() 函数调用将返回。
现在,如果你只有一个线程,这没什么用——你可以调用操作系统函数并等待它返回。但是如果你有多个线程并且你想在它们之间进行通信 - 那么你不能对其他线程进行函数调用。相反,您所做的是与另一个线程通信,告诉它做某事并给它事件,然后 Wait() 直到它完成。
现在,消息。
程序可以有所谓的“消息循环”,它是一个阻塞的线程,读取程序的消息队列。您可以向线程(或窗口)发送消息,该线程将自动读取该消息。因此,一种用途是,如果您有多个线程,则发出终止消息 - 是时候退出了。另一个是让线程知道你想让它做某事——一条消息可以接受两个整数值作为数据,所以你也可以将句柄传递给一个事件,这样线程就可以在它完成时向你发出信号。 (或者您可以让它在完成后向您发送消息;这完全取决于您希望如何组织代码 - 基于事件或基于消息)。
【讨论】:
Dani 是正确的:在 MFC 世界中,“事件”与控件相关联,并通过 WM_COMMAND 消息传递。 “消息”是一个更广泛的术语,包含所有 Windows 消息。有关示例,请参阅 msdn 文档以获取类似 BN_CLICKED 的内容。
这是一个令人遗憾的“事件”一词的重载,这相当令人困惑。它与更广泛的 Win32 世界中的事件无关,它们是内核同步对象。
【讨论】: