Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
4097 / 2702 / 590
Регистрация: 11.09.2009
Сообщений: 9,632

В Caption "(не отвечает), Progress Bar не перерисовывается. Как исправить?

26.11.2025, 19:34. Показов 8609. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Старое однопоточное приложение, Delphi 7, исходник есть.
В нём Progress Bar, показывающий процент выполнения вывода по USB. Процесс занимает секунд 20-40.
Примерно 50 на 50, примерно посередине времени выполнения процесса, система (Windows 7) замораживает форму, скачком чуть смещает её вправо и вниз на десяток пикселей, в её Caption система добавляет "(не отвечает)", перерисовки Progress Bar естественно нет. Причём программа прекрасно продолжает правильно работать, после завершения функции вывода по USB, форма "размораживается", и программа продолжает дальше работать.

Можно ли исправить такое "поведение" каким-нибудь простым "костылём"? Очень уж не хочется всю эту программу переписывать под потоки.

Видимо с этим уже пытались бороться, - есть Application.Process_Messages в местах смены значения Progress Bar.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2025, 19:34
Ответы с готовыми решениями:

Как сделать так что, если на 2 форме значение label.caption поменялось, то и на 1 форме у label.caption было такое же
У меня есть 2 формы. На них есть по одному label. Как сделать так что, если на второй...

Как работает Progress Bar
Все доброе время суток, не подскажете как работает Progress Bar и для чего он нужен?

Как связать FTP и progress bar?
P.S. как для скачивания(get), так и для отправки(put) файла на FTP. C помощью IDFTP.Sizе узнаю...

102
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
12.02.2026, 20:41
Студворк — интернет-сервис помощи студентам
Методология "херакс-херакс и в продакшн" в действии.
0
Злостный нарушитель
 Аватар для Verevkin
10896 / 5830 / 1289
Регистрация: 12.03.2015
Сообщений: 26,895
12.02.2026, 20:43
Цитата Сообщение от Rius Посмотреть сообщение
Методология "херакс-херакс и в продакшн" в действии.
У меня и такая картинка есть.
[censored]

 Комментарий модератора 
Мат запрещен в любой, даже завуалированной, форме
1
2 / 2 / 0
Регистрация: 28.11.2025
Сообщений: 29
16.04.2026, 16:32
Способ с двойным вызовом цикла обработки сообщений лишь увеличивает время, чтобы перерисовать форму и тп. Гарантии, что подвисать не будет - нет. Тогда 3 раза вызывать?
0
10 / 10 / 0
Регистрация: 10.05.2021
Сообщений: 33
18.05.2026, 08:50
Можно я выскажусь свежим взглядом?

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

Во-вторых, что сложного написать поток и одну процедуру обработки аля procedure ... (var Message: TMessage); message WM_USER + 1? А из потока отправляйте любые данные через PostMessage. Вы получите полностью независимые потоки исполнения, которые никаким образом не затормозят друг друга.

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

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

Простите, если кого-то обидела, но наболело %) Я с таким вот уже сталкивалась, и мне, как админу, было жутко стыдно объяснять почему плагины отчётов виснут и никак это не поправить...
2
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,495
Записей в блоге: 3
18.05.2026, 08:53
Цитата Сообщение от Hiori Посмотреть сообщение
Можно я выскажусь свежим взглядом?
Можно, конечно, вот только хорошо бы увидеть законченную мысль, а не вот этот поток сознания...
0
10 / 10 / 0
Регистрация: 10.05.2021
Сообщений: 33
18.05.2026, 09:00
Таб + энтер Простите
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,495
Записей в блоге: 3
18.05.2026, 09:11
Цитата Сообщение от Hiori Посмотреть сообщение
Таб + энтер
Понятненько
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
18.05.2026, 14:33
1) Через таймер, кинуть его на форму, интервал задать 500 мс. Вкл и выкл вручную. Универсальное решение.
Delphi
1
2
3
4
5
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ProgressBar1.Position := ProgressBar1.Position + 10; // примерно так
  if ProgressBar1.Position >= 100 then ProgressBar1.Position := 100;
end;
2) Критичные операции чтения надо дробить на циклы, например чтение по 1 Мб, тогда заморозки не будет. После каждого цикла пнуть ПрогрессБар
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
18.05.2026, 17:06
Цитата Сообщение от Hiori Посмотреть сообщение
было жутко стыдно объяснять почему плагины отчётов виснут и никак это не поправить...
Это же испанский стыд - когда накосячили другие, а стыдно почему-то тебе.

Цитата Сообщение от 119zero Посмотреть сообщение
Универсальное решение.
Универсальный говнокод это.
Длительные операции, подвешивающие поток UI (выполняющиеся более нескольких миллисекунд), следует выносить в отдельные потоки. Никакие таймеры от этого не спасут, так они они оправляют запрос на выполнение кода в тот же самый поток UI.
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
18.05.2026, 17:25
Цитата Сообщение от Rius Посмотреть сообщение
следует выносить в отдельные потоки.
Угу, потом долго тестить потоки, чтобы не глючили. И все равно глюкнет потом, код надо переписывать.
Таймер не замораживает Винду, это главное и точно не заглючит.
Цитата Сообщение от i8085 Посмотреть сообщение
вывода по USB. Процесс занимает секунд 20-40
Цитата Сообщение от i8085 Посмотреть сообщение
Можно ли исправить такое "поведение" каким-нибудь простым "костылём
Простое решение таймером, зачем тут мудрить ?
Или 2 вариант, пишется быстро и точно не заглючит, вообще нет паузы в миллисекундах.
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
18.05.2026, 17:40
Цитата Сообщение от 119zero Посмотреть сообщение
Угу, потом долго тестить потоки, чтобы не глючили.
Тестировать надо всё. Глюки ProcessMessages() известны более 20 лет, и всё равно этот костыль пихают где не надо.
Цитата Сообщение от 119zero Посмотреть сообщение
И все равно глюкнет потом, код надо переписывать.
Это от малого опыта. Учиться надо.
Цитата Сообщение от 119zero Посмотреть сообщение
Таймер не замораживает Винду, это главное и точно не заглючит.
Вызываемый через него долговыполняющийся код заморозит UI.
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
18.05.2026, 17:44
Цитата Сообщение от Rius Посмотреть сообщение
Тестировать надо всё
Я же цитаты автора привел выше. Специально.
Человеку надо проще, без переписывания кода, простейший костыль требуется. Не надо его толкать к яме, там и погибнет.
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
18.05.2026, 17:52
Потоки для профессионала не сложны. Не настолько, чтобы говнокодить, как новичок. И если бы сделали сразу нормально, этой темы бы не было.
Проблемы же предлагаемых вами костылей известны заранее.
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
18.05.2026, 17:57
Цитата Сообщение от Rius Посмотреть сообщение
Проблемы же предлагаемых вами костылей
Нет там проблем.
За 40 сек скачать дамп человеку надо. Пусть будет 40+1 сек с таймером.
Еще раз цитата. Именно про ПОТОКИ
Цитата Сообщение от i8085 Посмотреть сообщение
Можно ли исправить такое "поведение" каким-нибудь простым "костылём"? Очень уж не хочется всю эту программу переписывать под потоки.
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
18.05.2026, 18:05
Цитата Сообщение от 119zero Посмотреть сообщение
Нет там проблем.
Да канеш, нету! Запись так и так шла успешно, можно было оставить как есть, даже с NOT RESPONDING она бы выполнилась.
Следуя методологии херакс-херакс-и-в-продакшн, можно было "исправить" ещё проще: перед запуском процесса нарисовать на форме текст "Если программа покажется зависшей, просто подождите, всё нормально!"
Никаких потоков и даже таймеров.
1
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
18.05.2026, 18:12
Rius,
Все равно тема некропост, автор уже забыл что спрашивал.
Лучше частями качать, чтобы не думать и не искать потом ошибки, потом пнуть что нужно и заново цикл, это на 200% надежнее
0
2 / 2 / 0
Регистрация: 28.11.2025
Сообщений: 29
19.05.2026, 12:40
Странные споры. Потоки (нити) - самое правильное, простое и безопасное решение. Программист должен это освоить, ибо там нет никаких адских премудростей. При чём, в отдельном (не главном) потоке можно запускать не только долгую операцию, но и форму с ProgressBar. Главное разнести исполнение так, чтобы многозадачная ОС сама позаботилась о том, чтобы разный код не тормозил друг друга.
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
19.05.2026, 14:40
Цитата Сообщение от Sinferno Посмотреть сообщение
Странные споры. Потоки (нити)
Автор написал, что не надо потоки, почему все не умеют читать?
Цитата Сообщение от Sinferno Посмотреть сообщение
в отдельном (не главном) потоке можно запускать не только долгую операцию, но и форму с ProgressBar
Цитата Сообщение от Sinferno Посмотреть сообщение
Главное разнести исполнение
Сам же указываешь про сложность написания. Тут написать правильно, там подумать... И тестить обязательно.
Проще завернуть в цикл и тестить не надо, по коду видно, где накосячил.
Изначально понятно, что если просто отдать управление Винде, это может не сработать. А 2-3 раза подряд это делать, это уже глупость.
Вот с таймером конечно засада, может не сработать, но это быстро решается. Так что только цикл. Или таймер, выбрать что больше нравится.
0
Эксперт .NET
 Аватар для Rius
13848 / 7890 / 1707
Регистрация: 25.05.2015
Сообщений: 23,958
Записей в блоге: 14
19.05.2026, 14:43
Цитата Сообщение от 119zero Посмотреть сообщение
Автор написал, что не надо потоки, почему все не умеют читать?
Потому что это форум программистов, а не сюсюкания с детишками.
Потому что у иных методов есть заранее и давным-давно известные проблемы. Поэтому тема и возникла.
И только запуск отдельного потока или процесса - и правильный, и достаточно простой при этом для не чайника.
0
-293 / 14 / 1
Регистрация: 02.07.2021
Сообщений: 393
19.05.2026, 15:05
Цитата Сообщение от Rius Посмотреть сообщение
только запуск отдельного потока или процесса - правильный.
Неа, это выбор решения проблемы. Уже 3 варианта есть.
Недавно запустил игрушку, она начала грузить текстуры, сижу жду. Надпись ждите и все. Надоело, снял задачу и удалил игрушку. Типичное неуважение к юзеру, запустил поток и тишина, прогресса загрузки нет, на клаву нет реакции.
Так что потоки надо контролить, а это уже цикл. Вот как прыгнуть из потока? Никак, пока сам не остановится. Что делать в ситуации, когда вроде прога зависла и комп не реагирует. Сиди и думай, зависло или прогер правильный запустил поток правильно... или неправильно.
Цикл спасет !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2026, 15:05

Задание Progress bar
Имеется прграмма (её исполнительный фрагмент, больше в ней ничего нет), которая открывает текстовый...

Progress bar
как сделать так, чтобы при нажатии кнопки(загружающая в memo текст) она начинала работать, а когда...

«Progress Bar» в виде постепенно закрашиваемого посекторно круга
Помогите пожалуйста, «Progress Bar» в виде постепенно закрашиваемого посекторно круга. Выложите...

progress bar
Вообщем суть в этом у меня есть 3 формы в первой форме заполняются эдит1 потом открывается идет...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru