Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


DMS

Вопрос

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

А вот официальный пример от Эмбы: 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;

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

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

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

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

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

Ссылка на комментарий
  • 0

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

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

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

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

Ссылка на комментарий
  • 0

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

Ссылка на комментарий
  • 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
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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