gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:21:47 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com