• 0
DMS

Application.ProcessMessages - плохой стиль?

Вопросы

Все любят так говорить.

А вот официальный пример от Эмбы: http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RADStudio_Tokyo/Object Pascal/Multi-Device Samples/User Interface/KeyboardTypes

procedure TVKBaseForm.UpdateKBBounds;

var

LFocused : TControl;

LFocusRect: TRectF;

begin

FNeedOffset := False;

if Assigned(Focused) then

begin

LFocused := TControl(Focused.GetObject);

LFocusRect := LFocused.AbsoluteRect;

LFocusRect.Offset(VertScrollBox1.ViewportPosition);

if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and

(LFocusRect.Bottom > FKBBounds.Top) then

begin

FNeedOffset := True;

MainLayout1.Align := TAlignLayout.Horizontal;

VertScrollBox1.RealignContent;

Application.ProcessMessages;

VertScrollBox1.ViewportPosition :=

PointF(VertScrollBox1.ViewportPosition.X,

LFocusRect.Bottom - FKBBounds.Top);

end;

end;

if not FNeedOffset then

RestorePosition;

end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 ответов на этот вопрос

  • 0

Зависит от контекста.

Можно найти много полезных применений.

Помню, первый раз пользовался еще на Delphi 7  (там немного по-другому называлась), когда рисовал график по точкам и нужно было, чтобы график появился не сразу, а как бы анимацией.

Или например, когда нужно подсветить выбранный Item (пункт меню), перед тем как скрыть само меню, если после этого сразу выполняются какие-то действия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 2

в любом контексте это плохой стиль.

то что он в оф примерах это еще хуже

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ну, даже Ярослав считает это плохим стилем. ))

Тогда объясните плз, почему это плохой стиль.

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

Но если инструмент не приводит к сбою и решает поставленную задачу, то, как мне кажется, он не обязательно является плохим стилем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Ну плохой он еще и потому что код с процессмессаджес работал до 10.2.2 (у меня Delay был реализован с ProcessMessages). А после обновления до 10.2.2 - вылет из приложения. (знаю что выпустили в феврале патч для исправления этого бага в анимациях, но в другом коде оно все равно вылетать будет). Пришлось уходить в асинхронщину

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Application.ProcessMessages может и плоха, в FMX в принципе не использую, но вот в VCL помогает решить проблемы с перерисовкой)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

он помогает вставить нехилые грабли в программу

вот. специально старался писал. я конечно не GunSmoker, но попытался подробненько

http://www.cyberforum.ru/blogs/469693/blog4909.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, sinuke сказал:

Ну плохой он еще и потому что код с процессмессаджес работал до 10.2.2 (у меня Delay был реализован с ProcessMessages). А после обновления до 10.2.2 - вылет из приложения. (знаю что выпустили в феврале патч для исправления этого бага в анимациях, но в другом коде оно все равно вылетать будет). Пришлось уходить в асинхронщину

Насчёт 10.2.2 не знаю,  наверно так, раз у вас это наблюдается, но у меня вообще в этой версии под Андроид вылазят артефакты, иногда мерцают части отрисовки примерно  как у вас в Пятнашках. В результате вернулся на 10.1.2. А в ней с ProcessMessages ничего такого не замечал, да и вы тоже пишите, что использовали раньше.

47 минут назад, krapotkin сказал:

он помогает вставить нехилые грабли в программу

вот. специально старался писал. я конечно не GunSmoker, но попытался подробненько

http://www.cyberforum.ru/blogs/469693/blog4909.html

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 часов назад, krapotkin сказал:

в любом контексте это плохой стиль.

то что он в оф примерах это еще хуже

А как думаете, для чего в том коде Application.ProcessMessages? Какую задачу там выполняет? (не случайно же вставлен)

Пример же для мобильных устройств.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
10 часов назад, Alex7wrt сказал:

Но лично у меня ProcessMessages никогда не приводил к сбоям. Возможно потому, что использовал ее всегда в простых ситуациях вроде тех, о которых писал в посте выше.

Да-да, эта знаменитая фраза "у меня всё работает" :)

Видите ли, "простые ситуации" - это Вы скорее всего непосредственно про участок кода, в котором используется этот ProcessMessages.
Теперь представьте, что этот ProcessMessages вызывается в коде, который (первое, что пришло в голову) меняет цвет ListBoxItem. Чтобы сразу отобразились изменения. Просто? Да.
А на другом конце вселенной приложения запущен  таймер, который запрашивает данные с сервера и меняет ListBox.

И как раз в одном из ProcessMessages срабатывает этот таймер, уничтожая тот ListBoxItem, который мигает... Всё, приехали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, DMS сказал:

для чего в том коде Application.ProcessMessages? Какую задачу там выполняет? (не случайно же вставлен)

Возможно (лень смотреть) - не до конца отрабатывает RealignContent. Возможно - у него во внутренностях используются отложенные операции, дождаться завершения которых необходимо.

На текущий момент - имхо (опять-таки, лень смотреть) лучше всё, что после ProcessMessages заключить в TThread.ForceQueue, а сам ProcessMessages убрать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

при этом ProcessMessages это сообщение прокручивает, и это решает поставленную проблему, но порождает неверный порядок обработки сообщений

т.е. как обычно лекарство хуже болезни

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Так же плохой для многих стиль - goto, break и continue. А многим коллегам ума не хватает даже использовать  free /release и глобальные переменные, для них созданы всякие диезы с явами. И дальше что? Подстраиваться под всех, не используя возможности полноценного языка?

Application.ProcessMessages надо просто использовать с осторожностью. Таймеры отключать, за нажатиями на закрытие форм и пр. следить. Если есть какое-то долгое вычисление, которое не предсказуемо через какое время закончится, а таблицу уже начали обновлять, то милое дело запустить его в другом потоке, параллельно в GUI проигрывая анимашку.  Другие варианты  реализаций - это очень сложно, и интерфейс получится не отзывчивым.

Splash с прогрессом надо делать только так, если максимальной скорости загрузки хотим. Вообще много областей применений есть у  Application.ProcessMessages. Надо помнить об основных нюансах, иначе будут проблемы.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Akad сказал:

Таймеры отключать, за нажатиями на закрытие форм и пр. следить

вот тут полностью не соглашусь, и вот по какой причине.
Здесь и сейчас, разрабатывая приложение и будучи полностью погруженным в этот процесс, разработчик помнит о том, что где-то там ради своего удобства и большей простоты кода он использовал ProcessMessages. Соответственно - он отключит таймеры, заблокирует возможность нажатия и прочая и прочая.

Через пару месяцев после релиза поступает задача "добавить новый функционал". И я на 100% уверен, что никто, даже находясь в здравом уме и твердой памяти, не вспомнит об этом нюансе - что надо что-то там дисаблить и блокировать.

И потом - вы же сами говорите, что делая легче себе в одном месте - вам приходится следить (делать себе сложнее) в нескольких других. Так не лучше ли сразу делать так, чтобы не пришлось воспитывать в себе некую склонность к мазохизму?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 часов назад, kami сказал:

Через пару месяцев после релиза поступает задача "добавить новый функционал". И я на 100% уверен, что никто, даже находясь в здравом уме и твердой памяти, не вспомнит об этом нюансе - что надо что-то там дисаблить и блокировать.

Это примерно как забыть о том, как работает функция, что где править. Естественно забудет, а потом вспомнит, когда менять что-то будет в этом месте. Вдеть в начале процедуры прямо сразу cooltimer.Enabled := false; наведёт на мысли.

14 часов назад, kami сказал:

И потом - вы же сами говорите, что делая легче себе в одном месте - вам приходится следить (делать себе сложнее) в нескольких других. Так не лучше ли сразу делать так, чтобы не пришлось воспитывать в себе некую склонность к мазохизму?

Всегда много путей. Какой-то определённо проще. Но я не пишу приложения, которые лагают, которые нажал на кнопку рутинного действия и сидишь, ждёшь результат. Более того моё текущее приложение (клиент-серверное, с огромными объёмами данных от БД) ввобще не лагает, даже на 3G модеме, на котором параллельно ещё качается торрент. То есть для меня важно, что бы пользователь мог работать нормально.

Единственное о чём я сожалею, что всё завязано на FMX. От него "прилетает" безумное количество мелких и не очень глюков, отсутствие работающих скинов и так далее. Но это уже к теме не относится... Я в текущий момент из интерфейса по скорости и удобству выжал уже почти максимум в том числе и из-за Application.ProcessMessages. 
 

Изменено пользователем Akad

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу