|
|
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Есть цикл, в котором рисуется некоторая кривая (график). Нужно, чтобы она выводилась не вся сразу, а по шагам, последовательно (э... Как будто мы ведем карандашом по бумаге, а за грифелем появляется след). Сначала я сделал просто задержку при рисовании Sleep(SleepTime). Но оказалось, что если SleepTime = 1 и больше, то получается очень медленно. Тут я заметил, что вместо Sleep() можно вставить Application.ProcessMessages, - он тоже дает задержку, но меньшую, чем Sleep(1): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Все бы хорошо, но вот беда - когда строится график, программа очень медленно реагирует на другие события (нажатие на кнопку, котороая меняет значение переменной Stop, нажатие "на рисунок", когда должно запуститься копирование его в буфер). Казалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет. В чем может быть дело? Как сделать построение с задержкой? Заранее благодарю за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 11:57:37 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорКазалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет. В чем может быть дело? Как сделать построение с задержкой? Заранее благодарю за помощь. Не совсем опонял, что Вам таки нужно, "мгновенно" или "с задержкой", хочу только сказать, что насчёт "запускается в каждом цикле" - это мираж. далеко не в каждом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 12:25:13 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_Федор Казалось бы Application.ProcessMessages запускается в каждом цикле - все должно срабатывать мгновенно. Ан нет. В чем может быть дело? Как сделать построение с задержкой? Заранее благодарю за помощь. Application.ProcessMessages запускается в каждом цикле только если Form4.CheckBox3.Checked, а так через каждые 1000 итераций. Sleep основан на системном таймере, а это в лучшем случае, или 10 мсек, или 55 мсек. Для более частой обработки надо использовать мультимедия таймер, с ним можно достигнуть примерно 1 мсек. Ну и возможно для рисования линий использовать LineDDA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 12:25:38 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорЕсть цикл, в котором рисуется некоторая кривая (график). Нужно, чтобы она выводилась не вся сразу, а по шагам, последовательно (э... Как будто мы ведем карандашом по бумаге, а за грифелем появляется след). открой для себя TThread (Synchronize в т.ч.). также изучи некий TApplication.OnIdle (в тему Synchronize) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 12:27:17 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Хм. Если коротко, то Вы делаете максимально неправильно. Скажем, стоит во время вывода взять другое окно и протащить его над Вашим - и график может и не выжить. Позволю себе просто приложить максимально упрощенный пример относительно правильной реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 13:21:36 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarerХм. Если коротко, то Вы делаете максимально неправильно. Скажем, стоит во время вывода взять другое окно и протащить его над Вашим - и график может и не выжить. Позволю себе просто приложить максимально упрощенный пример относительно правильной реализации. кхм. я бы сказал - максимально упрощенный пример как раз неправильной организации. а) таймеры (вместо тредов) б) буферизация изображения - тоже, конечно, вариант, но решение с .DoubleBuffered и грамотной отработкой именно WM_PAINT - будет все-же более приближено к истине (хотя - тут и про DirectX уже можно подумать) но как максимально упрощенный - пожалуй да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 13:38:04 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhideа) таймеры (вместо тредов) А зачем там тред? Чтобы делать в нем Sleep? grexhideб) буферизация изображения - тоже, конечно, вариант, но решение с .DoubleBuffered и грамотной отработкой именно WM_PAINT - будет все-же более приближено к истине (хотя - тут и про DirectX уже можно подумать) Хм. Вы всегда охотитесь на воробьев с пушкой? Имхо таки стоит соразмерять цели и средства. Впрочем, я с интересом увижу решение с тредами и WM_PAINT, вкупе с объяснением, чем именно оно лучше для решения данной конкретной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 13:41:14 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer Хм. Вы всегда охотитесь на воробьев с пушкой? Имхо таки стоит соразмерять цели и средства. Впрочем, я с интересом увижу решение с тредами и WM_PAINT, вкупе с объяснением, чем именно оно лучше для решения данной конкретной задачи. ну не с пушкой ;)) но даже помповое ружье всяко предпочтительнее рогатки.. задача была именно динамической отрисовки графика, да так, чтобы не было дерганий экрана, интерактивность выдерживалась на уровне (в смысле не создавала неудобств пользователю), а также - вопрос с массой графиков одновременно - зачем гонять бестолку буферы изображений, если они в текущий момент пользователю и не видны ? (насчет WM_PAINT я, конечно загнул, использовался примерно такой же метод, только не в TImage, а в память .BMP напрямую, с отдельной ее отрисовкой по BitBlt - уход от VCL дал весьма заметное снижение нагрузки на CPU - порядка 30-40%). Но до DirectX тогда руки так и не дошли (сработал именно прицип целесообразности затрат).. да и в аспекте терминальных сессий - совсем не хотелось сильно заморачиваться. Но терминальные сессии как раз уже и поставили крест уже на механизме BitBlt, но это - совсем другая история. А таймеры, по моему скромному мнению, использовать вообще не разумно, разве именно как костыль, дополняющий OnIdle - в остальных случаях их применение просто нецелесообразно - именно в аспекте интерактивности и в виду наличия механизма потоков (тредов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 13:55:24 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
и все же - насчет WM_PAINT - от скорости обновления графика зависит. если график обновлять раз в минуту - то TImage и пр. как раз и не нужны - как раз более чем достаточно именно WM_PAINT (.Invalidate), и даже .DoubleBuffered уже как-бы и не сильно нужен. но за треды - именно потому, что может быть еще и ожидающее событие какое, а не только фиксированный квант времени обновления... а если скорость обновления <5 сек, то альтернатив тредам просто нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:07:44 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhideну не с пушкой ;)) но даже помповое ружье всяко предпочтительнее рогатки.. Сомнительно, сомнительно. grexhideзадача была именно динамической отрисовки графика, да так, чтобы не было дерганий экрана, интерактивность выдерживалась на уровне (в смысле не создавала неудобств пользователю), а также - вопрос с массой графиков одновременно Где? 8-[ ] (как следует протерев глаза) Так где все-таки? Либо я тупой, либо в упор не вижу. grexhideуход от VCL дал весьма заметное снижение нагрузки на CPU - порядка 30-40%) Хм. Безусловно. Но в примере решения простой задачи стоит писать коротко-ясно-стандартно. Когда наш собеседник дойдет до "TImage не удовлетворяет" - он уже легко сможет его заменить. grexhideА таймеры, по моему скромному мнению, использовать вообще не разумно, разве именно как костыль, дополняющий OnIdle - в остальных случаях их применение просто нецелесообразно - именно в аспекте интерактивности и в виду наличия механизма потоков (тредов). Хм. Скажем так, я сомневаюсь в существовании аргументации, показывающей преимущество OnIdle, тредов или чего-либо еще для решения данной конкретной задачи. Критерий прост: ничего лишнего. В данном случае нечего параллелить - значит, треды не нужны. Здесь нет, например, распараллеливания вычислений и отрисовки - у автора темы координаты посчитаны заранее, у меня их расчет мягко говоря быстр. А раз так - делать отдельный поток - значит делать синхронизацию двух ничего не делающих потоков. Зачем? OnIdle в данном случае хуже тем, что потребует самостоятельно контролировать временные промежутки, обеспечивая плавность и равномерность отрисовки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:11:58 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhideесли график обновлять раз в минуту - то TImage и пр. как раз и не нужны - как раз более чем достаточно именно WM_PAINT (.Invalidate), и даже .DoubleBuffered уже как-бы и не сильно нужен. Не согласен. 1. Если обновлять раз в минуту, DoubleBuffered действительно не нужен. Но для двадцати раз в секунду без него некрасиво. 2. Image в данном случае - "решение в ноль строк", альтернативное TBitmap+WM_PAINT (решение существенно больше чем в ноль строк). Итого, до тех пор, пока оно не мешает, это наиболее удачное решение. grexhideно за треды - именно потому, что может быть еще и ожидающее событие какое, Какое? Не вижу в постановке задачи никакого ожидающего события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:18:31 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer Где? 8-[ ] (как следует протерев глаза) да ладно, все это - полет буйной постановочной фантазии. у нас просто была цель - создать один раз некое универсальное решение, удовлетворяющее нескольким режимам и всевозможным аспектам эксплуатации (именно задача динамических графиков от показаний датчиков). потому каждый раз делать временное решение - на практике, себе дороже, если ты, конечно делаешь промышленную систему, а не курсовой какой (как в случае "Федор Федор") а с другой стороны - проблема графиков... сравнить, к примеру, Quest Spotlight и Oracle 10G Enterprise Manager.... в первом модель тредов, во втором - модель таймеров (усугубленная во сто крат кривой реализацией AJAX)... но тут боюсь оказаться голословным и не совсем объективным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:20:51 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer grexhideно за треды - именно потому, что может быть еще и ожидающее событие какое, Какое? Не вижу в постановке задачи никакого ожидающего события. изначальной - да, в целом - не совсем. элементарный вопрос - ожидание события от устройства. в один момент может потребоваться опрос как раз 20 раз в секунду, в остальных случах - устройство спит. (график не обязательно двигать раз в секунду - достаточно сдвигать раз в минуту на минуту в целом, а потом линию дорисовывать по необходимости) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:23:58 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarerВ данном случае нечего параллелить - значит, треды не нужны. уже есть. основной поток обработки сообщений Windows и собственно поток отрисовки графика. иначе мы что получим ? конкуренцию пользователя и строптивой программы, усиленно занятой в основном потоке динамической отрисовкой графика (задержка > .05 сек дает ощутимую потерю интерактивности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 14:31:03 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Упс. Не ожидал такой бурной дискуссии. Спасибо за помощь. Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно? Это прога для студентов - изучать поляризацию света. Делфи я знаю плохо. Мне важно как можно проще решить поставленную задачу. Например, если мне нужно, чтобы появлялась справка по нажатию на кнопку, я пишу: Код: plaintext 1. Боюсь, здесь тот же случай... Мне нужно, чтобы суммы колебаний появлялся на экране не сразу весь, а "потихоньку", последовательно, пошагово... См. рис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:20:05 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
У меня все рисуется прекрасно и все вроде работает. Наверное все коряво и плохо написано, но - главное - работает. Вот что плохо - когда я хочу скопировать рисуночек в Ворд, то щелкаю по Image (запускается процедура сохранения в буфер). Так вот. В режиме "пошагового построения" получается так: я щелкаю по экрану, а график продолжает себе спокойненько строиться дальше еще секунды три-пять. В итоге я получаю в буфере не тот рисунок, который хотел :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:25:04 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
сделай .AVI файл и показывай его всем желающим.... или Flash - векторная графика всяко предпочтительнее.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:26:16 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
я же говорю - треды !!! там есть такая фишка... Код: plaintext 1. 2. 3. 4. 5. 6. 7. ну и само собой в конструкторе-деструкторе соотвественно. InitializeCriticalSection(FLogSection); DeleteCriticalSection(FLogSection); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:29:03 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_Федор Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно? редкий аспирант сильно отличается полезностью и технической грамотностью - от студента и от преподавателя. Федор_Федор Боюсь, здесь тот же случай... Мне нужно, чтобы суммы колебаний появлялся на экране не сразу весь, а "потихоньку", последовательно, пошагово... а насчет флеша и .avi - это забавно ! даешь интерактивные "дохументы" ! в аспекте скорого появления электронной бумаги данная идея становится все менее экзотичной в своей "кабы не идиотичности" (как тут говорят некоторые). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:34:35 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhideу нас просто была цель - создать один раз некое универсальное решение, Это, конечно, особый вопрос. grexhideуже есть. основной поток обработки сообщений Windows и собственно поток отрисовки графика. Ой. То есть два потока, занятых в лучшем случае на 0.1% каждый. grexhideпрограммы, усиленно занятой в основном потоке динамической отрисовкой графика Хм. Как же надо ухитриться написать программу, чтобы она "усиленно занималась динамической отрисовкой графика"? Под отрисовкой я в данном случае понимаю процесс модификации bitmap-а, то, что делается внутри таймера. grexhide(задержка > .05 сек дает ощутимую потерю интерактивности) Согласен. И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT, вынести который в отдельный поток не очень-то просто. А выносить в поток содержимое OnTimer - только ради студенческого выпендрежа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 15:54:49 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer ну вот.... хотелось как лучше, а получилось - как всегда ;))) в принципе согласен - если нужно просто очень быстро сделать, то - таймеры в руки. на практике, в более-менее серьезном приложении, подобные злоупотребления нарастают как снежный ком. вроде бы и ничего страшного, но от массы полу- решений со временем получается та самая свалка кривых поделок, с неумолимо стремящимся к нулю запасом прочности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:00:09 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорТо что мне нужно работает. Зачем усложнять? Правильный сам по себе подход. Но тот фрагмент кода, который Вы привели, мало того что сложен, но еще и работать (хорошо) не будет. Федор_ФедорМне нужно, чтобы суммы колебаний появлялся на экране не сразу весь, а "потихоньку", последовательно, пошагово... Я дал Вам шаблон, как это делать. Вам достаточно будет только изменить несколько строк. Федор_ФедорВ режиме "пошагового построения" получается так: я щелкаю по экрану, а график продолжает себе спокойненько строиться дальше еще секунды три-пять. Так, как Вы написали - безусловно. Уверен, что строится он до тех пор, пока не сработает if i mod 1000 . Опять-таки, в моем примере сажаете еще кнопку, или OnClick, или что хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:01:36 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT это не совсем так. вернее - совсем не так. буфер прорисовки можно формировать в треде - а потом очень быстро (за миллисекунды - одним оператором bitblt) отобразить его в WM_PAINT. поставив критическую сессию, естественно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:06:10 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
и, кстати, совсем не понятна привязка к WM_PAINT - рисовать можно и без него, в принудительном порядке... правда, хоть убей, не помню, какие там возможны проблемы в случае тредов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:09:39 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhideна практике, в более-менее серьезном приложении, подобные злоупотребления нарастают как снежный ком. вроде бы и ничего страшного, но от массы полу- решений со временем получается та самая свалка кривых поделок, с неумолимо стремящимся к нулю запасом прочности. Я полностью согласен с описанием эскалации кривых решений, но в ходе нашей дискуссии не увидел ни одного, кроме сугубо религиозных, аргумента, при чем тут таймеры. В целом, имхо: 1. Тот, кто криво применяет таймеры, в потоках тем более таких дел наделает.... 2. Уместно примененные таймеры ничем плохим не характерны. По поводу выбора, имхо, также все довольно просто: 1. Ресурсоемкие операции, долгие ожидания и прочие вещи, надолго захватывающие выполнение, желательно выносить в отдельные потоки. 2. Короткие операции, выполняемые время от времени, желательно инициировать таймерами. 3. Признаком неуместно примененного таймера являются ухудшение интерактивности программы, усложнение кода таймера, попытка разбить выполняемое на куски типа "это сейчас, это в следующем срабатывании" итп. 4. Признаком неуместно примененного потока является слишком частая его синхронизация с другими потоками; ситуация, при которой поток большей частью ожидает времени, когда ему будет пора работать. 5. И применение таймеров, и применение потоков, требует определенного уровня грамотности разработчика и соблюдения соответствующей "техники безопасности". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:19:01 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhide softwarer И в данной конкретной программе все задержки, которые только могут быть, сосредоточены в WM_PAINT это не совсем так. вернее - совсем не так. буфер прорисовки можно формировать в треде - а потом очень быстро (за миллисекунды - одним оператором bitblt) отобразить его в WM_PAINT. поставив критическую сессию, естественно. 1. То, что "можно" никоим боком не относится к данной конкретной программе. В ней задержки сосредоточены именно там, и выносить в тред что-то другое смысла довольно мало. 2. Да, можно. Будет та самая стрельба из пушки по воробьям. Если есть две операции, выполняющиеся за миллисекунды каждая, разносить их в разные потоки - только ухудшать производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:21:37 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer в отдельных случаях - вполне разумные доводы. просто я хотел сказать примерно то, что применение таймеров - это лишь способ - "незаморачиваться лукаво" на треды, т.е. просто способ быстро сляпаять некий суррогат и не более. о грамотности применения таймеров ни под каким соусом никакой речи быть не может, априори. это не религия, это просто здравый смысл. даже классические операции - делать это раз в пять секунд должны решаться именно тредом - просто потому, что sleep(msec) куда более логичен и малозатратен для системы, чем Timer.Interval Если есть базовая концепция - последовательное выполнение операций, с индикацией прогресса на долгих операциях или "песочными часами", если по другому никак, то любое распареллеливание потока программы должно делать только на механизме тредов - практика их применения не намного сложнее таймеров, при том, что на порядок выигрывает по всем остальным позициям. таймер - это вообще остатки былого "величия" кооперативной модели win16 и наличесвуют просто как дань совместимости. зачем же плодить кривые методы в новых разработках ? (тем более, посмотрите на его реализацию - FWindowHandle, WM_TIMER в т.ч.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:32:24 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
softwarer 2. Да, можно. Будет та самая стрельба из пушки по воробьям. Если есть две операции, выполняющиеся за миллисекунды каждая, разносить их в разные потоки - только ухудшать производительность. в чем суть выстрела из пушки и в чем суть ухудшения производительности ? в разы ? конкретные цифры ? в том, что обработка WM_TIMER - значительно менее затратное решение, чем TThread и Sleep ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:34:51 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhide таймер - это вообще остатки былого "величия" кооперативной модели win16 и тем более, покажите мне пример именно таймеров в классической модели POSIX ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 16:37:06 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
grexhide Федор_Федор Это не курсовой. Если человек не шарит в Делфи, то это не значит, что он студент. Верно? редкий аспирант сильно отличается полезностью и технической грамотностью - от студента и от преподавателя. Не понял... Слишком хитро. А преподаватели студенты и аспирантны бывают разные. Сейчас студенты зачастую лучше преподавателей разбираются в программировании... grexhide а насчет флеша и .avi - это забавно ! даешь интерактивные "дохументы" ! в аспекте скорого появления электронной бумаги данная идея становится все менее экзотичной в своей "кабы не идиотичности" (как тут говорят некоторые). AVI - это, конечно, хорошо. Но тут идея как раз была такая - чтобы студент ввел, скажем фазу одного из колебаний 90 градусов и с ужасом увидел круговую поляризацию. Тут дело в том, что иногда при повороте графика все так криво накладывается, что не видно, как же трактория изменяется. У меня, правда, график в пространстве можно вращать, но все равно, выпендрежа ради, я решил засандалить еще и пошаговое построение. Программа вообще бесплатная (ох посмеются все сейчас) :-) Могу выслать. Правда, она у меня метр почти "весит" :-) Повеселитесь :-) Главное, чтобы мой About никто не переделал... :-) Это вот проблема... А то две недели работы даром пропадут :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 17:33:11 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Softwarer, спасибо. Вы как обычно, помогли (я раньше был Иван_Иван, мучал народ программой расчета линзовых растров). Скачала вашу прогу. Сижу изучаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 17:34:48 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 17:58:42 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_Федор что и требовалось доказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 18:13:05 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорКто такой таймер мне пока неведомо. Милый, ты совсем забыл меня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 18:48:00 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Кнопка F1 Федор_ФедорКто такой таймер мне пока неведомо. Милый, ты совсем забыл меня :-) Во-первых, их шпрехе энглишь зэр шлехт. Вот. А в-вторых, я никак не пойму эту дурацкую помощь в Делфи. В Паскале все было отлично. Вот тебе процедура, вот - что она делает, вот - все ее аргументы и т.д., вот - пример проги на паскале. А в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота. Давай искать. И начинаются ветвящиеся гиперссылки. Таймер такой, таймер сякой, все от секундомера Касио до часов Таймекс. :-) Потом, появляются в тексте о таймере всякие "классы", "компоненты", API... Страшные слова... :-( Скорее всего, дело тут не в том, что "лыжи не едут", но все же... Я понимаю, что немножко посмеяться над профаном хочется :) Но теперь вы посмеялись, я тоже посмеялся, теперь можно помочь. Наверное... 8) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 19:41:02 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорА в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота. А ты набери Ttimer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 19:43:45 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Anatoly Podgoretsky Федор_ФедорА в Делфи... Набрал я timer, нажал F1... И в ответ - тишина. Точнее пустота. А ты набери Ttimer А вы шаман, однако. Спасибо. Дело сдвинулось с мертовой точки. Опять загадочная буква Т... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 19:46:30 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Федор_ФедорА вы шаман, однако. Спасибо. Дело сдвинулось с мертовой точки. Опять загадочная буква Т... Не такая и загадочная, это сокращение от Type ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2006, 20:05:18 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
почитал эту тему. да... не ругайтесь, что поднимаю старую тему grexhideдаже классические операции - делать это раз в пять секунд должны решаться именно тредом - просто потому, что sleep(msec) куда более логичен и малозатратен для системы, чем Timer.Intervalа как же потом обращаться к VCL, из треда, делающего это раз в пять секунд? с помощью synchronize, принимающего только имя метода без параметров, т.е., параметры отрисовки, и обновления "этого" раз в пять секунд нужно как-то передавать из потока, в глобальных, или каких-то там переменных, что влияет на "надёжность", или они могут поменяться из соседнего потока Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. тогда, может выполниться присвоение caption_string из первого потока, потом выполнение переключится на второй, и выполнится присвоение в нём, а потом снова на первый, и UpdateCaption будет выполнен из него. так вот, чему же будет равно Caption? или, если вместо form1.caption сделать добавление в memo, то одно сообщение может пропасть (т.е., будут 2 одинаковых) а защитить критической секцией и caption_string, и Synchronize - невозможно, потому что Synchronize должен вызываться без критической секции. нихьт? и операции вроде добавления чего-то в memo, или отрисовки чего-то "раз в пять секунд" превращаются в головную боль. нихьт? через сообщения? а если надо не текст, а что-нибудь посложнее, какую-нибудь структуру данных, а то и не одну? а если нужно попеременно выполнять распараллеливаемый код с изменением vcl-компонентов, эт на каждое изменение - свою процедуру делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 02:56:53 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
ya_ne_robot, wcthread решит все эти проблемы. но одну не решит, голову придется включать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 08:53:29 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
wadmanwcthread решит все эти проблемы кстати, ты в девелопмент Лазаря часом не предложил, чтоб твой компонент в сорцы включили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 09:00:27 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
Докwadmanwcthread решит все эти проблемы кстати, ты в девелопмент Лазаря часом не предложил, чтоб твой компонент в сорцы включили? Они там тормознутые... Отправил патч для лазрепорта, чтоб поправили пару строк для возможности формирования отчета в другом потоке. И тишина. В смысле висит на рассмотрении до сих пор. А вообще, пока рано. Нужно протестировать под FreeBsd, там чего-то не компилируется, но руки не доходят. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 09:05:35 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
[OFF] wadmanНужно протестировать под FreeBsd, там чего-то не компилируется, но руки не доходят. :) так ты напиши в ограничениях типа "only windows, gtk2, qt... etc". В Лазаре полно таких. Кстати, можно тут на всеобщее обозрение выложить - чем больше сторонников, тем быстрее вопрос решится. зы. это наше чисто рассейское неумение себя преподнести... [/OFF] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 09:24:32 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
ДокКстати, можно тут на всеобщее обозрение выложить Лежит уже http://forum.lazarus.freepascal.org/index.php/topic,34505.0.html :-) Там и вылезла бага с компиляцией под freebsd. Обещали отписаться и помочь, но тишина... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 09:29:55 |
|
||
|
Проблема с Application.ProcessMessages
|
|||
|---|---|---|---|
|
#18+
wadmanно тишина... так ты дергай время от времени тред... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2017, 16:21:14 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2042079]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
181ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 468ms |

| 0 / 0 |
