Приложение Delphi содержания с практическими рекомендациями, Быстро реагирующее во время Обновлений GUI?

Этот вопрос о хранении GUI, быстро реагирующего во время более длинных выполняющихся задач (несколько секунд в большинстве случаев).

Я экстенсивно использую потоки и шаблон задачи для выполнения дорогой задачи в фоновом потоке. Но что относительно обновлений GUI, который занимает время? Например, заполняя большую строковую сетку или структурный вид? Поток не помогает здесь, потому что все должно синхронизироваться с основным потоком так или иначе.

Я знаю проблемы Application.ProcessMessages, но в настоящее время это походит на единственное решение поместить вызовы в ProcessMessages в GUI обновляют методы.

Какие-либо лучшие идеи?

5
задан BoltClock 14 September 2012 в 10:31
поделиться

6 ответов

Одним из примеров API высокого (er) уровня в BouncyCastle может быть пакет CMS ( Синтаксис криптографических сообщений ). Это поставляется в отдельной банке (bcmail) от самого провайдера, и записывается в JCE (версия C # написана против облегченного API, однако).

"Send a confidential message" реализуется, грубо говоря, классом CMSEnvableedDataGenerator, и все, что вам действительно нужно сделать, это дать ему сообщение, выбрать алгоритм шифрования (все детали обрабатываются внутри), а затем указать один или несколько способов, которыми получатель сможет прочитать сообщение: это может быть основано на открытом ключе/сертификате, общем секрете, пароле или даже протоколе соглашения о ключе. В сообщении может быть несколько получателей, а также можно смешивать и сопоставлять типы получателей.

Можно использовать CMSSignedDataGenerator для аналогичной отправки проверяемого сообщения. Если вы хотите подписать и зашифровать, структуры CMS являются вложенными/составными (но порядок может быть важным). Существует также генератор данных CMSCompedDataGenerator и недавно добавленный CMSAuthenticureData.

-121--1428388-

IMO, если обновление графического интерфейса пользователя является узким местом (даже если BeginUpdate/EndUpdate используется так, как предлагает @ The _ Fox), то настало время пересмотреть используемые элементы управления графического интерфейса пользователя. Стандартные сетки, treeviews, listboxes не просто вырезаны для обработки очень большого количества элементов. Для этой цели существует много эффективных средств контроля третьих сторон, как свободных, так и коммерческих.

Если узкое место находится в сетке, treeview или в контексте списка, для начала извлеките VirtureTreeview.

5
ответ дан 18 December 2019 в 13:14
поделиться

При заполнении решеток, списков, наборов данных и т. Д., Вызов beginuppdate / endupdate disablecontrols / enablecontrols. Это сэкономит ваше время. У меня также была нить, которая проводила некоторые расчеты, но, тем не менее, графический интерфейс был медленным, пока я не позвонил от DisableControls на наборов данных, которые были изменены и не видны, потому что элементы управления находятся на другом таблице.

Кроме того, при обновлении элементов управления есть все необходимые данные, которые вам нужны, чтобы вы могли просто заполнить свой список, не выполняя расчеты, которые могут замедлить это.

5
ответ дан 18 December 2019 в 13:14
поделиться
-

Что не так с Application.Processmessages В вашем случае? Метод Application.ProcessMessages именно для таких случаев. Проблема с Application.Processmessages - код, такой как этот код:

repeat
  Application.ProcessMessages;
until SomethingHappens;

, который плохо, поскольку он бесполезный нагрузка CPU и должна быть заменена на

repeat
  Application.HandleMessage;
until SomethingHappens;

, что дает процессорное время в другие потоки. Одиночное приложение. Призывы вызовы (не в цикле) в порядке.

4
ответ дан 18 December 2019 в 13:14
поделиться

Взгляните ActiveSleep .

1
ответ дан 18 December 2019 в 13:14
поделиться

Если вы хотите обрабатывать только сообщения о рисовании и больше ничего: вместо Application.ProcessMessages используйте следующее:

procedure ProcessPaintMessages;
var
  Msg: TMsg;
  i: Integer;
begin
  i := 0;
  repeat
    if Windows.PeekMessage(Msg, 0, 0, 0, PM_REMOVE or (QS_PAINT shl 16)) then begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end else Break;
    Inc(i);
  until i > 1000; // Breakout if we are in a paint only loop!
end;
1
ответ дан 18 December 2019 в 13:14
поделиться

Вы опробовали антифриз компонента от Indy?

-2
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: