2016-01-25 3 views
1

Я использую C++ Builder (BCB6) и на:ProcessMessages на OnShow с Event ++ Builder

FormShow  

событие есть:

Application->ProcessMessages 

Я хотел бы знать, что именно ответственность:

Application->ProcessMessages 

Что именно это произошло? и когда мы будем использовать это? когда это может вызвать exp.?

Спасибо!

+0

окончательно закончил редактирование. btw ** BCB6 ** хуже из серии (слишком много ошибок), если у вас есть опция переключения на ** BCB5, BDS2006 ** или новее (не имеют опыта работы с более поздними). ** BDS2006 ** имеют бесплатные лицензии на 100 лет, но их серверы не работают. Я уверен, что вы можете скачать его рег-файл из сети где-нибудь. Компилятор лучше, чем [эта ошибка] (http://stackoverflow.com/a/18016392/2521214), которую можно легко избежать. И реализация ** CodeGuard ** сэкономит мне много времени (к сожалению, не используется в действительно сложных приложениях). – Spektre

+0

Есть также сторонние стороны: вам нужен как минимум двухъядерный процессор для IDE, чтобы избежать случайных зависаний на несколько просто раздражает) и избегать просмотра слишком больших массивов (это заставляет заморозить IDE навсегда), не говоря уже о том, что для IDE требуется множество фреймворков, а также исправление x64 для перезапуска IDE из-за обновления безопасности шрифтов Windows. – Spektre

ответ

0
  1. В BDS 2006 IDE помощь государства для Application->ProcessMessages этого:

    прервет выполнение приложения, так что он может обрабатывать очереди сообщений.

    Позвоните ProcessMessages, чтобы разрешить приложению обрабатывать сообщения, которые в настоящее время находятся в очереди сообщений. ProcessMessages циклически обрабатывает цикл сообщений Windows до тех пор, пока он не будет пустым, а затем вернет управление в приложение.

    Пренебрежение обработкой сообщений влияет только на приложение, вызывающее ProcessMessages, а не на другие приложения. При длительных операциях вызов ProcessMessages периодически позволяет приложению реагировать на краску и другие сообщения.

    ProcessMessages не позволяет приложению простаивать, тогда как HandleMessage делает.

  2. так что это?

    Это позволяет реагировать на сообщений Windows, в случае ваше приложение блокирует нормальный WindProc операции (внутри VCL). Например, если вы получили какое-то длительное вычисление на каком-либо событии, которое занимает минуты, приложение замерзнет (не может щелкнуть, переместить, изменить размер, перерисовать, ... пока операция не будет выполнена). Если вы один раз за раз вызываете ProcessMessages из этого длинного цикла (таймеры также не будут работать в течение этого времени), что позволит сделать ваше приложение более быстрым в течение этого времени ... поэтому он не замерзнет.

    Я обычно использую threads or OnIdle event для таких вычислений, поэтому основное приложение не блокируется вообще.

    Я не хочу верить, что во время такой блокировки вызывается OnShow. Я бы на месте ProcessMessages внутри вычислений, который блокирует приложение (если вычисления находится внутри OnShow то OK иначе это было бы бесполезно. Во всяком случае OnShow вызывается только если ваша форма превращается в Visible не спутать его OnActivate или OnPaint.

  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 он начнет увеличивать целое число в поле CaptionForm1 и останавливается, когда вы нажимаете btStop. во время подсчета App все еще реагирует (можно щелкнуть, переместить, изменить размер, ...). Вам нужно остановиться до закрытия приложения (деструкторы ждут возвращения из всех событий). если вы выберете Application->ProcessMessages();, тогда приложение будет считаться, но никогда не остановится, потому что вы не можете нажать на btStop из-за замораживания. Для закрытия нажмите на IDE и нажмите CTRL + F2.

Надеюсь, что это немного почистит.

Смежные вопросы