c++ - OnShow 事件上的 ProcessMessages c++ builder

标签 c++ message-queue show c++builder c++builder-6

我正在使用 c++ builder (bcb6) 和 on:

FormShow    

事件有:

Application->ProcessMessages

我想知 Prop 体责任是什么:

Application->ProcessMessages

它到底做了什么?我们什么时候用那个?什么时候会导致exp.?

谢谢!

最佳答案

  1. BDS 2006 IDE 帮助说明 Application->ProcessMessages 是这样的:

    中断应用程序的执行,以便它可以处理消息队列。

    调用ProcessMessages 以允许应用程序处理当前在消息队列中的消息。 ProcessMessages 循环 Windows 消息循环直到它为空,然后将控制权返回给应用程序。

    忽略消息处理只会影响调用 ProcessMessages 的应用程序,不会影响其他应用程序。在冗长的操作中,定期调用 ProcessMessages 允许应用程序响应绘制和其他消息。

    ProcessMessages 不允许应用程序空闲,而 HandleMessage 允许。

  2. 那是为了什么?

    如果您的应用阻止正常的 WindProc 操作(在 VCL 内),它允许响应 Windows 消息。例如,如果您对某些需要几分钟的事件进行了冗长的计算,应用程序将卡住(无法单击、移动、调整大小、重绘……直到操作完成)。如果您偶尔从那个长循环中调用 ProcessMessages(计时器在此期间也不会工作),这将使您的应用程序在此期间响应......所以它不会卡住。

    我通常使用threads or OnIdle event而不是进行此类计算,因此根本不会阻止主应用程序。

    我不愿意相信 OnShow 在这种阻塞期间被调用。我会将 ProcessMessages 放在阻止应用程序的计算中(如果计算在 OnShow 中,那么它是 OK 否则它将毫无用处无论如何,OnShow 仅在您的表单变为Visible 时才被调用,不要将其误认为是OnActivateOnPaint

  3. 小例子

    创建空表单应用程序并在其中放置 2 个按钮 (btStart,btStop),然后为它们创建点击事件,如下所示:

    //---------------------------------------------------------------------------
    bool go=false;
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btStartClick(TObject *Sender)
        {
        int i=0;
        for (go=true;go;)
            {
            Caption=i; i++;
            Application->ProcessMessages();
            Sleep(100);
            }
        }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btStopClick(TObject *Sender)
        {
        go=false;
        }
    //---------------------------------------------------------------------------
    

    当您启动应用程序并单击 btStart 时,它将开始递增 Form1Caption 字段中的整数,并在您单击 时停止bt停止。在计数期间应用程序仍然响应(可以单击、移动、调整大小...)。您需要在关闭 App 之前停止(析构函数等待从所有事件返回)。如果您移除 Application->ProcessMessages(); 则应用程序将计数但永远不会停止,因为由于卡住您无法单击 btStop。要关闭,请单击 IDE 并按 CTRL+F2

希望它能把事情弄清楚一些。

关于c++ - OnShow 事件上的 ProcessMessages c++ builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997097/

相关文章:

php - RabbitMQ 实现

MPI - 跨进程共享队列

string - 重写 Haskell 中 String/Char 的 show 方法

javascript - 使用 JQuery 仅在该 div 中显示/隐藏按钮

javascript在页面加载时隐藏div,直到if语句条件选择div

c++ - 尝试在 Linux 上使用 Clang++ 编译 c++11 正则表达式教程时出错

c++ - 了解如何在链接列表的末尾添加新节点

c++ - 使用匿名结构初始化会在堆栈上放置额外的拷贝吗?

c++ - 有没有办法在 Halide Generator 中将两个输入图像堆叠到一个 4 维缓冲区中?

azure - 消费者如何处理服务总线主题?