Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理有关OnShow事件c和x2B的消息+;建设者 我使用C++ Builder(BCB6),并在:_C++_Message Queue_Show_C++builder_C++builder 6 - Fatal编程技术网

处理有关OnShow事件c和x2B的消息+;建设者 我使用C++ Builder(BCB6),并在:

处理有关OnShow事件c和x2B的消息+;建设者 我使用C++ Builder(BCB6),并在:,c++,message-queue,show,c++builder,c++builder-6,C++,Message Queue,Show,C++builder,C++builder 6,活动有: Application->ProcessMessages 我想知道以下方面的具体责任: Application->ProcessMessages 它到底做了什么?我们什么时候用它?什么时候会引起exp 谢谢 BDS 2006 IDE帮助说明了Application->ProcessMessagesthis: 中断应用程序的执行,以便它可以处理消息队列 调用ProcessMessages以允许应用程序处理当前在消息队列中的消息ProcessMessages循环Window

活动有:

Application->ProcessMessages
我想知道以下方面的具体责任:

Application->ProcessMessages
它到底做了什么?我们什么时候用它?什么时候会引起exp

谢谢

  • BDS 2006 IDE帮助说明了
    Application->ProcessMessages
    this:

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

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

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

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

  • 那么这是为了什么呢?

    如果您的应用程序阻止正常的WindProc操作(在VCL内部),它允许响应Windows消息。例如,如果您对某个事件进行了耗时数分钟的长时间计算,则应用程序将冻结(在操作完成之前无法单击、移动、调整大小、重新绘制等)。如果您在一次时间呼叫中处理来自该长循环的消息(计时器在该时间内也不工作),这将允许您的应用程序在此期间响应。。。所以它不会结冰

    我通常用它来代替这样的计算,这样主应用程序就不会被阻塞

    我不愿意相信在这种阻塞期间会调用
    OnShow
    。我会将
    ProcessMessages
    放在阻止应用程序的计算中(如果计算在
    OnShow
    中,则它是OK否则它将是无用的。无论如何,只有当窗体转到
    Visible
    时才会调用
    OnShow
    ,请不要将其误认为
    OnActivate
    OnPaint

  • 小示例

    创建空表单应用程序并在其中放置两个按钮(
    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
    时,它将在
    Form1
    Caption
    字段中开始递增整数,并在您单击
    btStop
    时停止。在计数期间,应用程序仍有响应(可以单击、移动、调整大小等)。您需要在关闭应用程序之前停止(析构函数等待从所有事件中返回)。如果您rem出
    应用程序->ProcessMessages();
    ,则应用程序将计数,但不会停止,因为由于冻结,您无法单击
    btStop
    。要关闭,请单击IDE,然后按CTRL+F2

  • 希望它能把事情弄清楚一点

  • BDS 2006 IDE帮助说明了
    Application->ProcessMessages
    this:

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

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

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

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

  • 那么这是为了什么呢?

    如果您的应用程序阻止正常的WindProc操作(在VCL内部),它允许响应Windows消息。例如,如果您对某个事件进行了耗时数分钟的长时间计算,应用程序将冻结(在操作完成之前无法单击、移动、调整大小、重新绘制等)。如果您在一次时间呼叫中处理来自该长循环的消息(计时器在此期间也不工作),这将允许您的应用程序在此期间响应…因此它不会冻结

    我通常用它来代替这样的计算,这样主应用程序就不会被阻塞

    我不愿意相信在这种阻塞期间会调用
    OnShow
    。我会将
    ProcessMessages
    放在阻塞应用程序的计算中(如果计算在
    OnShow
    中,则它是OK否则它将是无用的。无论如何,只有当窗体转到
    Visible
    时才会调用
    OnShow
    ,请不要将其误认为
    OnActivate
    OnPaint

  • 小示例

    创建空表单应用程序并在其中放置两个按钮(
    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
    时,它将在
    Form1
    Caption
    字段中开始递增整数,并在您单击
    btStop
    时停止。在计数期间,应用程序仍有响应(可以单击、移动、调整大小等)。您需要在关闭应用程序之前停止(析构函数等待从所有事件中返回)。如果您rem出
    应用程序->ProcessMessages();
    ,则应用程序将计数,但不会停止,因为由于冻结,您无法单击
    btStop
    。要关闭,请单击IDE,然后按CTRL+F2


  • 希望它能澄清一些问题。

    终于完成了编辑。顺便说一句,BCB6比t更糟糕