【问题标题】:Modal operation using IMessageFilter and DoEvents使用 IMessageFilter 和 DoEvents 的模态操作
【发布时间】:2010-09-30 00:07:45
【问题描述】:

这是一个 Windows 窗体应用程序。我有一个函数可以模态捕获一些鼠标事件,直到满足条件。例如,我想在函数返回之前等待用户在窗口的客户区中选择一个点(或者可选地使用 Escape 键取消操作)。我正在使用以下结构:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

除了在控制进入 while 循环时占用了将近 100% 的 CPU 使用率之外,这非常有效。我正在寻找类似于如下所示的替代方案:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    // Assuming that ManagedGetMessage() below is a blocking
    // call which yields control to the OS
    if(ManagedGetMessage())
        Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

IMessageFilter 和DoEvents 的正确使用方法是什么?在收到消息之前,如何将控制权交给操作系统?托管世界中是否有任何 GetMessage 等效项?

【问题讨论】:

    标签: windows winforms user-interface winapi


    【解决方案1】:

    您可以在 DoEvents() 调用之间让线程休眠 500 毫秒左右。尝试不同的值,看看感觉正确。

    【讨论】:

    • +1 但我仍然希望能够像过去那样做 GetMessage() 之类的事情。
    • 哇! 10 毫秒的睡眠效果非常好。也很有意义,因为评估布尔值并在空事件队列上调用 DoEvents() 只需要一毫秒的时间。
    猜你喜欢
    • 2017-07-31
    • 2013-07-04
    • 1970-01-01
    • 2021-01-27
    • 2014-02-27
    • 2012-10-18
    • 2013-04-11
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多