powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с Application.ProcessMessages
46 сообщений из 46, показаны все 2 страниц
Проблема с Application.ProcessMessages
    #33684174
Есть цикл, в котором рисуется некоторая кривая (график). Нужно, чтобы она выводилась не вся сразу, а по шагам, последовательно (э... Как будто мы ведем карандашом по бумаге, а за грифелем появляется след).

Сначала я сделал просто задержку при рисовании Sleep(SleepTime). Но оказалось, что если SleepTime = 1 и больше, то получается очень медленно.

Тут я заметил, что вместо Sleep() можно вставить Application.ProcessMessages, - он тоже дает задержку, но меньшую, чем Sleep(1):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 Repeat 
      If  (Form4.CheckBox3.Checked) then   begin  Application.ProcessMessages;sleep(SleepTime); end ;
      If  (i  mod   1000 )= 0   then  Application.ProcessMessages;
     x:=Round(Mas3[i, 1 ]-Mas3[i, 0 ]* 1 . 414214 / 4 );
     y:=Round(Mas3[i, 2 ]+Mas3[i, 0 ]* 1 . 414214 / 4 );
     Imag.Canvas.LineTo((O1.x-x), (O1.y-y));
     i:=i+ 1 ;
 Until  (i=MasLength)  or  Stop;

Все бы хорошо, но вот беда - когда строится график, программа очень медленно реагирует на другие события (нажатие на кнопку, котороая меняет значение переменной Stop, нажатие "на рисунок", когда должно запуститься копирование его в буфер). Казалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет.
В чем может быть дело?
Как сделать построение с задержкой?

Заранее благодарю за помощь.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684199
Фотография Luchkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорКазалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет.
В чем может быть дело?
Как сделать построение с задержкой?

Заранее благодарю за помощь.
Не совсем опонял, что Вам таки нужно, "мгновенно" или "с задержкой", хочу только сказать, что насчёт "запускается в каждом цикле" - это мираж. далеко не в каждом.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684200
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор
Казалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет.
В чем может быть дело?
Как сделать построение с задержкой?

Заранее благодарю за помощь.
Application.ProcessMessages запускается в каждом цикле только если Form4.CheckBox3.Checked, а так через каждые 1000 итераций.
Sleep основан на системном таймере, а это в лучшем случае, или 10 мсек, или 55 мсек. Для более частой обработки надо использовать мультимедия таймер, с ним можно достигнуть примерно 1 мсек. Ну и возможно для рисования линий использовать LineDDA
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684202
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорЕсть цикл, в котором рисуется некоторая кривая (график). Нужно, чтобы она выводилась не вся сразу, а по шагам, последовательно (э... Как будто мы ведем карандашом по бумаге, а за грифелем появляется след).



открой для себя TThread (Synchronize в т.ч.).

также изучи некий TApplication.OnIdle (в тему Synchronize)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684252
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. Если коротко, то Вы делаете максимально неправильно. Скажем, стоит во время вывода взять другое окно и протащить его над Вашим - и график может и не выжить.

Позволю себе просто приложить максимально упрощенный пример относительно правильной реализации.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684264
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Если коротко, то Вы делаете максимально неправильно. Скажем, стоит во время вывода взять другое окно и протащить его над Вашим - и график может и не выжить.

Позволю себе просто приложить максимально упрощенный пример относительно правильной реализации.

кхм. я бы сказал - максимально упрощенный пример как раз неправильной
организации.

а) таймеры (вместо тредов)
б) буферизация изображения - тоже, конечно, вариант, но решение с
.DoubleBuffered и грамотной отработкой именно WM_PAINT - будет
все-же более приближено к истине (хотя - тут и про DirectX уже можно
подумать)

но как максимально упрощенный - пожалуй да.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684267
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideа) таймеры (вместо тредов)
А зачем там тред? Чтобы делать в нем Sleep?

grexhideб) буферизация изображения - тоже, конечно, вариант, но решение с .DoubleBuffered и грамотной отработкой именно WM_PAINT - будет
все-же более приближено к истине (хотя - тут и про DirectX уже можно
подумать)
Хм. Вы всегда охотитесь на воробьев с пушкой?

Имхо таки стоит соразмерять цели и средства. Впрочем, я с интересом увижу решение с тредами и WM_PAINT, вкупе с объяснением, чем именно оно лучше для решения данной конкретной задачи.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684277
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Хм. Вы всегда охотитесь на воробьев с пушкой?

Имхо таки стоит соразмерять цели и средства. Впрочем, я с интересом увижу решение с тредами и WM_PAINT, вкупе с объяснением, чем именно оно лучше для решения данной конкретной задачи.

ну не с пушкой ;)) но даже помповое ружье всяко предпочтительнее рогатки..

задача была именно динамической отрисовки графика, да так, чтобы
не было дерганий экрана, интерактивность выдерживалась на уровне (в смысле
не создавала неудобств пользователю), а также - вопрос с массой графиков
одновременно - зачем гонять бестолку буферы изображений, если они
в текущий момент пользователю и не видны ? (насчет WM_PAINT я, конечно
загнул, использовался примерно такой же метод, только не в TImage, а
в память .BMP напрямую, с отдельной ее отрисовкой по BitBlt - уход
от VCL дал весьма заметное снижение нагрузки на CPU - порядка 30-40%).

Но до DirectX тогда руки так и не дошли (сработал именно прицип
целесообразности затрат).. да и в аспекте терминальных сессий - совсем
не хотелось сильно заморачиваться. Но терминальные сессии как раз уже
и поставили крест уже на механизме BitBlt, но это - совсем другая история.

А таймеры, по моему скромному мнению, использовать вообще не разумно,
разве именно как костыль, дополняющий OnIdle - в остальных случаях их
применение просто нецелесообразно - именно в аспекте интерактивности и
в виду наличия механизма потоков (тредов).
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684289
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и все же - насчет WM_PAINT - от скорости
обновления графика зависит.

если график обновлять раз в минуту - то TImage и пр. как
раз и не нужны - как раз более чем достаточно именно WM_PAINT (.Invalidate),
и даже .DoubleBuffered уже как-бы и не сильно нужен.

но за треды - именно потому, что может быть еще и ожидающее событие какое,
а не только фиксированный квант времени обновления... а если скорость
обновления <5 сек, то альтернатив тредам просто нет.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684293
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideну не с пушкой ;)) но даже помповое ружье всяко предпочтительнее рогатки..
Сомнительно, сомнительно.

grexhideзадача была именно динамической отрисовки графика, да так, чтобы не было дерганий экрана, интерактивность выдерживалась на уровне (в смысле не создавала неудобств пользователю), а также - вопрос с массой графиков одновременно
Где? 8-[ ] (как следует протерев глаза) Так где все-таки? Либо я тупой, либо в упор не вижу.

grexhideуход от VCL дал весьма заметное снижение нагрузки на CPU - порядка 30-40%)
Хм. Безусловно. Но в примере решения простой задачи стоит писать коротко-ясно-стандартно. Когда наш собеседник дойдет до "TImage не удовлетворяет" - он уже легко сможет его заменить.

grexhideА таймеры, по моему скромному мнению, использовать вообще не разумно, разве именно как костыль, дополняющий OnIdle - в остальных случаях их применение просто нецелесообразно - именно в аспекте интерактивности и
в виду наличия механизма потоков (тредов).
Хм. Скажем так, я сомневаюсь в существовании аргументации, показывающей преимущество OnIdle, тредов или чего-либо еще для решения данной конкретной задачи.

Критерий прост: ничего лишнего. В данном случае нечего параллелить - значит, треды не нужны. Здесь нет, например, распараллеливания вычислений и отрисовки - у автора темы координаты посчитаны заранее, у меня их расчет мягко говоря быстр. А раз так - делать отдельный поток - значит делать синхронизацию двух ничего не делающих потоков. Зачем? OnIdle в данном случае хуже тем, что потребует самостоятельно контролировать временные промежутки, обеспечивая плавность и равномерность отрисовки.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684302
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideесли график обновлять раз в минуту - то TImage и пр. как
раз и не нужны - как раз более чем достаточно именно WM_PAINT (.Invalidate),
и даже .DoubleBuffered уже как-бы и не сильно нужен.
Не согласен.

1. Если обновлять раз в минуту, DoubleBuffered действительно не нужен. Но для двадцати раз в секунду без него некрасиво.

2. Image в данном случае - "решение в ноль строк", альтернативное TBitmap+WM_PAINT (решение существенно больше чем в ноль строк). Итого, до тех пор, пока оно не мешает, это наиболее удачное решение.

grexhideно за треды - именно потому, что может быть еще и ожидающее событие какое,
Какое? Не вижу в постановке задачи никакого ожидающего события.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684305
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Где? 8-[ ] (как следует протерев глаза)


да ладно, все это - полет буйной постановочной фантазии.

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

потому каждый раз делать временное решение - на практике, себе дороже, если
ты, конечно делаешь промышленную систему, а не курсовой какой (как
в случае "Федор Федор")

а с другой стороны - проблема графиков... сравнить, к примеру,
Quest Spotlight и Oracle 10G Enterprise Manager....

в первом модель тредов, во втором - модель таймеров (усугубленная во сто
крат кривой реализацией AJAX)... но тут боюсь оказаться голословным и
не совсем объективным.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684307
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
grexhideно за треды - именно потому, что может быть еще и ожидающее событие какое,
Какое? Не вижу в постановке задачи никакого ожидающего события.

изначальной - да, в целом - не совсем. элементарный вопрос - ожидание события
от устройства. в один момент может потребоваться опрос как раз 20 раз в секунду,
в остальных случах - устройство спит. (график не обязательно двигать
раз в секунду - достаточно сдвигать раз в минуту на минуту в целом, а потом
линию дорисовывать по необходимости)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684312
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВ данном случае нечего параллелить - значит, треды не нужны.

уже есть. основной поток обработки сообщений Windows и
собственно поток отрисовки графика.

иначе мы что получим ? конкуренцию пользователя и строптивой
программы, усиленно занятой в основном потоке динамической отрисовкой
графика (задержка > .05 сек дает ощутимую потерю интерактивности)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684340
Упс. Не ожидал такой бурной дискуссии.

Спасибо за помощь.

Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно?

Это прога для студентов - изучать поляризацию света.

Делфи я знаю плохо. Мне важно как можно проще решить поставленную задачу.

Например, если мне нужно, чтобы появлялась справка по нажатию на кнопку, я пишу:
Код: plaintext
1.
  ShellExecute(Application.Handle, 'open', 'lissajous3D.chm', PChar('newitem2.htm'),  Nil , SW_SHOWNORMAL);
Мне достаточно одной строки. И пусть это тысячу раз неправильно, и нужно подключить модуль из 500 строк кода... То что мне нужно работает. Зачем усложнять?

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

См. рис.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684347
У меня все рисуется прекрасно и все вроде работает. Наверное все коряво и плохо написано, но - главное - работает.

Вот что плохо - когда я хочу скопировать рисуночек в Ворд, то щелкаю по Image (запускается процедура сохранения в буфер). Так вот. В режиме "пошагового построения" получается так: я щелкаю по экрану, а график продолжает себе спокойненько строиться дальше еще секунды три-пять. В итоге я получаю в буфере не тот рисунок, который хотел :-(
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684349
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай .AVI файл и показывай его всем желающим....

или Flash - векторная графика всяко предпочтительнее..
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684351
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я же говорю - треды !!!

там есть такая фишка...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  EnterCriticalSection(FLogSection);
   try 
...
   finally 
    LeaveCriticalSection(FLogSection);
   end ;


ну и само собой в конструкторе-деструкторе соотвественно.

InitializeCriticalSection(FLogSection);

DeleteCriticalSection(FLogSection);
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684357
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор
Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно?

редкий аспирант сильно отличается полезностью и
технической грамотностью - от студента и от преподавателя.

Федор_Федор
Боюсь, здесь тот же случай...
Мне нужно, чтобы суммы колебаний появлялся на экране не сразу весь, а "потихоньку", последовательно, пошагово...


а насчет флеша и .avi - это забавно !

даешь интерактивные "дохументы" !

в аспекте скорого появления электронной бумаги данная идея становится
все менее экзотичной в своей "кабы не идиотичности" (как тут говорят некоторые).
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684374
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideу нас просто была цель - создать один раз некое универсальное решение,
Это, конечно, особый вопрос.

grexhideуже есть. основной поток обработки сообщений Windows и
собственно поток отрисовки графика.
Ой. То есть два потока, занятых в лучшем случае на 0.1% каждый.

grexhideпрограммы, усиленно занятой в основном потоке динамической отрисовкой графика
Хм. Как же надо ухитриться написать программу, чтобы она "усиленно занималась динамической отрисовкой графика"? Под отрисовкой я в данном случае понимаю процесс модификации bitmap-а, то, что делается внутри таймера.

grexhide(задержка > .05 сек дает ощутимую потерю интерактивности)
Согласен. И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT, вынести который в отдельный поток не очень-то просто. А выносить в поток содержимое OnTimer - только ради студенческого выпендрежа.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684379
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

ну вот.... хотелось как лучше, а получилось - как всегда ;)))

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

на практике, в более-менее серьезном приложении, подобные злоупотребления
нарастают как снежный ком. вроде бы и ничего страшного, но от массы
полу- решений со временем получается та самая свалка кривых поделок,
с неумолимо стремящимся к нулю запасом прочности.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684382
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорТо что мне нужно работает. Зачем усложнять?
Правильный сам по себе подход. Но тот фрагмент кода, который Вы привели, мало того что сложен, но еще и работать (хорошо) не будет.

Федор_ФедорМне нужно, чтобы суммы колебаний появлялся на экране не сразу весь, а "потихоньку", последовательно, пошагово...
Я дал Вам шаблон, как это делать. Вам достаточно будет только изменить несколько строк.

Федор_ФедорВ режиме "пошагового построения" получается так: я щелкаю по экрану, а график продолжает себе спокойненько строиться дальше еще секунды три-пять.
Так, как Вы написали - безусловно. Уверен, что строится он до тех пор, пока не сработает if i mod 1000 .

Опять-таки, в моем примере сажаете еще кнопку, или OnClick, или что хотите.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684386
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT

это не совсем так. вернее - совсем не так. буфер прорисовки можно
формировать в треде - а потом очень быстро (за миллисекунды - одним оператором bitblt) отобразить его в WM_PAINT. поставив критическую сессию, естественно.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684388
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, кстати, совсем не понятна привязка к WM_PAINT - рисовать можно
и без него, в принудительном порядке...

правда, хоть убей, не помню, какие там возможны проблемы в случае
тредов.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684399
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideна практике, в более-менее серьезном приложении, подобные злоупотребления нарастают как снежный ком. вроде бы и ничего страшного, но от массы полу- решений со временем получается та самая свалка кривых поделок,
с неумолимо стремящимся к нулю запасом прочности.
Я полностью согласен с описанием эскалации кривых решений, но в ходе нашей дискуссии не увидел ни одного, кроме сугубо религиозных, аргумента, при чем тут таймеры. В целом, имхо:

1. Тот, кто криво применяет таймеры, в потоках тем более таких дел наделает....
2. Уместно примененные таймеры ничем плохим не характерны.

По поводу выбора, имхо, также все довольно просто:

1. Ресурсоемкие операции, долгие ожидания и прочие вещи, надолго захватывающие выполнение, желательно выносить в отдельные потоки.

2. Короткие операции, выполняемые время от времени, желательно инициировать таймерами.

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

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

5. И применение таймеров, и применение потоков, требует определенного уровня грамотности разработчика и соблюдения соответствующей "техники безопасности".
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684401
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhide softwarer И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT
это не совсем так. вернее - совсем не так. буфер прорисовки можно
формировать в треде - а потом очень быстро (за миллисекунды - одним оператором bitblt) отобразить его в WM_PAINT. поставив критическую сессию, естественно.
1. То, что "можно" никоим боком не относится к данной конкретной программе. В ней задержки сосредоточены именно там, и выносить в тред что-то другое смысла довольно мало.

2. Да, можно. Будет та самая стрельба из пушки по воробьям. Если есть две операции, выполняющиеся за миллисекунды каждая, разносить их в разные потоки - только ухудшать производительность.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684405
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

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

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

даже классические операции - делать это раз в пять секунд
должны решаться именно тредом - просто потому, что sleep(msec) куда
более логичен и малозатратен для системы, чем Timer.Interval

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

таймер - это вообще остатки былого "величия" кооперативной модели win16 и
наличесвуют просто как дань совместимости. зачем же плодить кривые
методы в новых разработках ? (тем более, посмотрите на его реализацию -
FWindowHandle, WM_TIMER в т.ч.)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684407
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
2. Да, можно. Будет та самая стрельба из пушки по воробьям. Если есть две операции, выполняющиеся за миллисекунды каждая, разносить их в разные потоки - только ухудшать производительность.

в чем суть выстрела из пушки и в чем суть ухудшения производительности ?
в разы ? конкретные цифры ?

в том, что обработка WM_TIMER - значительно менее затратное решение, чем TThread и Sleep ?
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684408
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhide
таймер - это вообще остатки былого "величия" кооперативной модели win16 и


тем более, покажите мне пример именно таймеров в классической модели POSIX ?
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684433
grexhide Федор_Федор
Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно?

редкий аспирант сильно отличается полезностью и
технической грамотностью - от студента и от преподавателя.

Не понял... Слишком хитро.
А преподаватели студенты и аспирантны бывают разные. Сейчас студенты зачастую лучше преподавателей разбираются в программировании...

grexhide
а насчет флеша и .avi - это забавно !

даешь интерактивные "дохументы" !

в аспекте скорого появления электронной бумаги данная идея становится
все менее экзотичной в своей "кабы не идиотичности" (как тут говорят некоторые).

AVI - это, конечно, хорошо. Но тут идея как раз была такая - чтобы студент ввел, скажем фазу одного из колебаний 90 градусов и с ужасом увидел круговую поляризацию.
Тут дело в том, что иногда при повороте графика все так криво накладывается, что не видно, как же трактория изменяется. У меня, правда, график в пространстве можно вращать, но все равно, выпендрежа ради, я решил засандалить еще и пошаговое построение.

Программа вообще бесплатная (ох посмеются все сейчас) :-)

Могу выслать. Правда, она у меня метр почти "весит" :-) Повеселитесь :-)

Главное, чтобы мой About никто не переделал... :-) Это вот проблема... А то две недели работы даром пропадут :-)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684434
Softwarer, спасибо.

Вы как обычно, помогли (я раньше был Иван_Иван, мучал народ программой расчета линзовых растров).
Скачала вашу прогу. Сижу изучаю.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684445
Softwarer, пытаюсь разобраться в вашей программе...
По нажатию на кнопку Старт, вы стираете все на Image и
задаете
Timer.Enabled := true ;
Кто такой таймер мне пока неведомо. Но все же...
По нажатию на кнопку Стоп вы таймер делаете недоступным:
Timer.Enabled := False ;
А само построение идет в подпрограмме
procedure TFormCircle.TimerTimer(Sender: TObject);

Верно?

Я так понимаю, пока Timer.Enabled=True, подпрограмма "работает". Как только Таймер.Enabled=False, подпрограмма "не работает".

Верно?

Я вот только ни черта, сорри, не понимаю, откуда взялась эта подпрограмма procedure TFormCircle.TimerTimer(Sender: TObject)?
Меня эти буквы T и слова "Sender: TObject" пугают. Обычно они сами по себе появляются - тогда я стараюсь их не трогать.

Вот моя подпрограмма она строит два графика быстро, а третий (Сумму) - медленно, по шагам:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 //****************************************************************************** 
 //CURVE3 
 Procedure  Curve3(Imag:TImage; Mas1,Mas2,Mas3:Massiv; HSizeImage,VSizeImage:Integer);
 var 
i:integer;
 Begin 
     Imag.Canvas.Pen.Width:=LineWidth;
 //Строим график A1(t) 
      If  Form1.CheckBox4.Checked=True  then  
      Begin 
         For  i:= 1   to  MasLength  do 
         Begin 
            If  (i  mod   1000 )= 0   then   Begin  Application.ProcessMessages;  If  Stop  then  exit;  End ;
           Imag.Canvas.Pen.Color := RGB(ColorA1.R,ColorA1.G,ColorA1.B);
           Imag.Canvas.MoveTo(Round(-Mas1[i- 1 , 0 ]+HSizeImage/ 2 ),Round(-Mas1[i- 1 , 1 ]+VSizeImage/ 2 ));
           Imag.Canvas.LineTo(Round(-Mas1[i, 0 ]+HSizeImage/ 2 ),Round(-Mas1[i, 1 ]+VSizeImage/ 2 ));
         End ;
      End ;
 //Строим график A2(t) 
      If  Form1.CheckBox5.Checked=True  then 
      Begin 
         For  i:= 1   to  MasLength  do 
         Begin 
            If  (i  mod   1000 )= 0   then   Begin  Application.ProcessMessages;  If  Stop  then  exit;  End ; 
            Imag.Canvas.Pen.Color := RGB(ColorA2.R,ColorA2.G,ColorA2.B);
            Imag.Canvas.MoveTo(Round(-Mas2[i- 1 , 0 ]+HSizeImage/ 2 ),Round(-Mas2[i- 1 , 1 ]+VSizeImage/ 2 ));
            Imag.Canvas.LineTo(Round(-Mas2[i, 0 ]+HSizeImage/ 2 ),Round(-Mas2[i, 1 ]+VSizeImage/ 2 ));
         End ;
      End ;
     Application.ProcessMessages;
 //Строим график A3(t) 
      If  Form1.CheckBox6.Checked=True  then 
      Begin 
         For  i:= 1   to  MasLength  do 
         Begin 
             If  (i  mod   1000 )= 0   then   Begin  Application.ProcessMessages;  If  Stop  then  exit;  End ;
 // Form4.CheckBox3.Checked = True - значит, что указано пошаговое построение 
             If  Form4.CheckBox3.Checked  then   begin  Application.ProcessMessages;sleep(SleepTime); end ;
            Imag.Canvas.Pen.Color := RGB(ColorA3.R,ColorA3.G,ColorA3.B);
            Imag.Canvas.MoveTo(Round(-Mas3[i- 1 , 0 ]+HSizeImage/ 2 ),Round(-Mas3[i- 1 , 1 ]+VSizeImage/ 2 ));
            Imag.Canvas.LineTo(Round(-Mas3[i, 0 ]+HSizeImage/ 2 ),Round(-Mas3[i, 1 ]+VSizeImage/ 2 ));
         End ;
         End ;
Mas1:= NIL ;
Mas2:= NIL ;
Mas3:= NIL ;
 End ; {Конец процедуры Curve3} 
 //****************************************************************************** 
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684459
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор

что и требовалось доказать.
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684486
Кнопка F1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Федор_ФедорКто такой таймер мне пока неведомо.
Милый, ты совсем забыл меня
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684520
Кнопка F1 Федор_ФедорКто такой таймер мне пока неведомо.
Милый, ты совсем забыл меня

:-)

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

А в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота. Давай искать. И начинаются ветвящиеся гиперссылки. Таймер такой, таймер сякой, все от секундомера Касио до часов Таймекс. :-) Потом, появляются в тексте о таймере всякие "классы", "компоненты", API... Страшные слова... :-(

Скорее всего, дело тут не в том, что "лыжи не едут", но все же...

Я понимаю, что немножко посмеяться над профаном хочется :)
Но теперь вы посмеялись, я тоже посмеялся, теперь можно помочь.
Наверное... 8)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684522
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорА в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота.
А ты набери Ttimer
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684524
Anatoly Podgoretsky Федор_ФедорА в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота.
А ты набери Ttimer
А вы шаман, однако. Спасибо. Дело сдвинулось с мертовой точки.

Опять загадочная буква Т...
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #33684528
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорА вы шаман, однако. Спасибо. Дело сдвинулось с мертовой точки.

Опять загадочная буква Т...
Не такая и загадочная, это сокращение от Type
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Проблема с Application.ProcessMessages
    #39480074
ya_ne_robot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почитал эту тему. да...
не ругайтесь, что поднимаю старую тему

grexhideдаже классические операции - делать это раз в пять секунд
должны решаться именно тредом - просто потому, что sleep(msec) куда
более логичен и малозатратен для системы, чем Timer.Intervalа как же потом обращаться к VCL, из треда, делающего это раз в пять секунд?
с помощью synchronize, принимающего только имя метода без параметров, т.е., параметры отрисовки, и обновления "этого" раз в пять секунд нужно как-то передавать из потока, в глобальных, или каких-то там переменных, что влияет на "надёжность", или они могут поменяться из соседнего потока

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure MyThread1.Execute;
begin
  caption_string:='let''s update caption';
  Synchronize(UpdateCaption);
end;

procedure MyThread2.Execute;
begin
  caption_string:='i''m first';
  Synchronize(UpdateCaption);
end;

procedure UpdateCaption;
begin
  Form1.Caption := caption_string;
end;



тогда, может выполниться присвоение caption_string из первого потока, потом выполнение переключится на второй, и выполнится присвоение в нём, а потом снова на первый, и UpdateCaption будет выполнен из него. так вот, чему же будет равно Caption?
или, если вместо form1.caption сделать добавление в memo, то одно сообщение может пропасть (т.е., будут 2 одинаковых)

а защитить критической секцией и caption_string, и Synchronize - невозможно, потому что Synchronize должен вызываться без критической секции. нихьт?

и операции вроде добавления чего-то в memo, или отрисовки чего-то "раз в пять секунд" превращаются в головную боль. нихьт?

через сообщения? а если надо не текст, а что-нибудь посложнее, какую-нибудь структуру данных, а то и не одну?

а если нужно попеременно выполнять распараллеливаемый код с изменением vcl-компонентов, эт на каждое изменение - свою процедуру делать
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480120
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ya_ne_robot, wcthread решит все эти проблемы. но одну не решит, голову придется включать...
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480124
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanwcthread решит все эти проблемы
кстати, ты в девелопмент Лазаря часом не предложил, чтоб твой компонент в сорцы включили?
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480127
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докwadmanwcthread решит все эти проблемы
кстати, ты в девелопмент Лазаря часом не предложил, чтоб твой компонент в сорцы включили?
Они там тормознутые...
Отправил патч для лазрепорта, чтоб поправили пару строк для возможности формирования отчета в другом потоке. И тишина. В смысле висит на рассмотрении до сих пор.

А вообще, пока рано. Нужно протестировать под FreeBsd, там чего-то не компилируется, но руки не доходят. :)
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480138
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[OFF]
wadmanНужно протестировать под FreeBsd, там чего-то не компилируется, но руки не доходят. :)
так ты напиши в ограничениях типа "only windows, gtk2, qt... etc". В Лазаре полно таких. Кстати, можно тут на всеобщее обозрение выложить - чем больше сторонников, тем быстрее вопрос решится.

зы. это наше чисто рассейское неумение себя преподнести...
[/OFF]
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480148
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКстати, можно тут на всеобщее обозрение выложить
Лежит уже http://forum.lazarus.freepascal.org/index.php/topic,34505.0.html :-)
Там и вылезла бага с компиляцией под freebsd. Обещали отписаться и помочь, но тишина...
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480531
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanно тишина...
так ты дергай время от времени тред...
...
Рейтинг: 0 / 0
Проблема с Application.ProcessMessages
    #39480534
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докwadmanно тишина...
так ты дергай время от времени тред...
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с Application.ProcessMessages
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]