【问题标题】:Events and messages in mfcmfc 中的事件和消息
【发布时间】:2017-03-06 16:43:27
【问题描述】:

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

【问题讨论】:

    标签: mfc


    【解决方案1】:

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

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

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

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

    另见msdn中的一些解释

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        事件是一个内核同步对象,有点像二进制互斥锁。它可以有两种状态:已发出信号和未发出信号。它用于同步线程,线程获取它(使用 WaitForSingleObject 或其表亲)并通过 SetEvent API 释放它。

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

        【讨论】:

          【解决方案4】:

          更多细节可能有用。

          事件优先。

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

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

          现在,消息。

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-27
              • 1970-01-01
              • 2014-08-20
              • 2015-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多