Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TThread -> ProgressBar -> Основная форма / 25 сообщений из 58, страница 1 из 3
24.06.2019, 23:14
    #39830090
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Доброго дня господа !

Прошу совета

Имею основную формe, в ней "подвал" TStatusBar (с набором панелей)

Имею класс TThread в нем осуществляется длительный процесс обработки данных.
Визуализация процесса обработки выводиться на объект TProgressBar
(который описан в виде поля и создан в классе TThread)

Но визуализацию "бегущей дорожки" хотелось бы видеть в основной форме,
на одной из панелей TStatusBar

1. как правильно синхронизировать процесс "бежания дорожки"
2. как правильно завести TProgressBar в одну из панелей TSatusBar - (TProgresBar.Parent:=TStatusBar.Panels[1])
3. размер TProgressBar=размеру TStatusBar.Panels[1]

Заранее благодарен !
...
Рейтинг: 0 / 0
25.06.2019, 00:24
    #39830097
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_Xописан в виде поля и создан в классе TThread

Вот второе - ошибка. Все визуальные компоненты (окна) должны создаваться в главном потоке.
Потом рабочему потоку можно отдать ссылку (лучше хэндл) этого окна чтобы он мог его
использовать для посылки сообщений (и, таким образом, визуализации своей работы).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2019, 01:14
    #39830100
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
...
Рейтинг: 0 / 0
25.06.2019, 01:23
    #39830102
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Крутая фича
...
Рейтинг: 0 / 0
25.06.2019, 08:17
    #39830128
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Dimitry SibiryakovHOME_Xописан в виде поля и создан в классе TThread

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


Нет вопросов - а как правильно организовать синхронизацию в момент Progress+1
Если с помощью Synchronize(Моя процедура) - будет все время тормозиться основная форма
- не будет большого смысла в потоке.
Поясните пожалуйста ..
...
Рейтинг: 0 / 0
25.06.2019, 08:49
    #39830138
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_XПоясните пожалуйста ..
Сообщением главной форме.
...
Рейтинг: 0 / 0
25.06.2019, 08:53
    #39830140
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
wadman,

Не могли бы подослать код в качестве примера ...

Спасибо
...
Рейтинг: 0 / 0
25.06.2019, 08:55
    #39830141
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_XПоясните пожалуйста ..

И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
...
Рейтинг: 0 / 0
25.06.2019, 09:01
    #39830146
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_XНе могли бы подослать код в качестве примера ...
У формы есть Handle, форма может принимать сообщения http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm
И есть процедура winapi: postmessage.
...
Рейтинг: 0 / 0
25.06.2019, 10:26
    #39830198
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
wadmanHOME_XНе могли бы подослать код в качестве примера ...
У формы есть Handle, форма может принимать сообщения http://www.cryer.co.uk/brian/delphi/howto_send_custom_window_message.htm
И есть процедура winapi: postmessage.
На Handle формы лучше не закладываться, он иногда может пересоздаваться. Надежнее хранить ссылку на форму. Либо создать хэндл в главном потоке самому через AllocateWnd
...
Рейтинг: 0 / 0
25.06.2019, 10:32
    #39830203
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
x1ca4064HOME_XПоясните пожалуйста ..

И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
Обычный таймер вполне подходит для этого.
...
Рейтинг: 0 / 0
25.06.2019, 10:41
    #39830209
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
wadmanСообщением главной форме.

Зачем главной-то? Отдаём хэндл прогресс-бара, соответственно и сообщение посылается прямо ему:
Код: sql
1.
PostMessage(ProgressBar.Handle, PBM_SETPOS, Percent, 0);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2019, 10:46
    #39830218
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Cobalt747x1ca4064пропущено...
И лучше это делать не на каждой итерации, а разумно: 2-3 раза в секунду, обычно, достаточно.
Обычный таймер вполне подходит для этого.
Тогда вообще ничего передавать не надо, сделать свойство у TThred и через какой-нибудь InterlockedIncrement() его считывать/увеличивать.
...
Рейтинг: 0 / 0
25.06.2019, 10:48
    #39830221
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Cobalt747Обычный таймер вполне подходит для этого.

Обычно, "Обычный таймер" :) , не используют в потоках.
...
Рейтинг: 0 / 0
25.06.2019, 10:54
    #39830223
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
x1ca4064Cobalt747Обычный таймер вполне подходит для этого.

Обычно, "Обычный таймер" :) , не используют в потоках.
Очевидно, что таймер будет на форме, нет? :)
...
Рейтинг: 0 / 0
25.06.2019, 11:11
    #39830239
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
alekcvpсделать свойство у TThred и через какой-нибудь InterlockedIncrement() его
считывать/увеличивать.
Interlocked функции в данном случае совершенно ни к чему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2019, 13:43
    #39830334
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
wadman,

Не совсем понял - Вы предложили использовать Win API (PostMessage и т.д.)
Зачем ? Вы хотите "связать-развязать" потоки через операционку ?

Почему нельзя передать указатель на TProgressBar в конструктор потока
TThread.Create(......,,,a: TProgressBar....) , держать его как поле потока и не-
посредственно к нему обращаться в процессе цикла ? Тут есть противоречие ?

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

Т.е. Synchronize(.....) использовал для синхронизации переменных, команда останав-
ливала все действия и синхронизировала ИЗМЕНЕННЫЕ ресурсы во времени.

В моем случае - меняет переменную "Progress + 1" только вспомогательный поток.
На главном потоке идет считывание, команда Synchronize(.....) - нужна ли вообще ?
И как основной поток знает что "Progress + 1" изменился, чтобы отRefresh - ть строку ?

Спасибо .
...
Рейтинг: 0 / 0
25.06.2019, 13:50
    #39830344
AlexeyM123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
бесплатная книга

Getting started with Embarcadero Delphi

https://riptutorial.com/topic?q=delphi&submit=Search

Chapter 8: Running a thread while keeping GUI responsive
...
Рейтинг: 0 / 0
25.06.2019, 14:25
    #39830362
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_XПочему нельзя передать указатель на TProgressBar в конструктор потока
TThread.Create(......,,,a: TProgressBar....) , держать его как поле потока и не-
посредственно к нему обращаться в процессе цикла ? Тут есть противоречие ?

C точки зрения архитектуры это плохая практика.
Мухи (расчет) - отдельно, котлеты (визуализация) - отдельно. Когда понадобиться сделать другой индикатор или добавить, скажем, запись логов придется все переделывать.
Лучше сразу писать правильно- отослал сообщение и пусть на той стороне решают что с ним делать.
...
Рейтинг: 0 / 0
25.06.2019, 14:35
    #39830366
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_X,
Всё дело в том, что VCL не является потокобезопасной. Т.е. если из разных потоков рисовать на канве окна, то можно получить ошибку. Вот по этому и следует делать так, чтобы все визуальные изменения делались в основном потоке, а расчеты вынести во вспомогательный поток. А вспомогательный поток уже уведомляет основной о том, что процент выполнения задачи изменился.
Самое простое - создать в форме обработчик Вашего пользовательского сообщения, из которого менять % в прогрессбаре.
...
Рейтинг: 0 / 0
25.06.2019, 14:49
    #39830371
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
HOME_XВы предложили использовать Win API (PostMessage и т.д.)
Зачем ?

Затем, что это самый простой, надёжный и безопасный способ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2019, 15:06
    #39830376
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
VCL не тред-сейф, а вот WinAPI вполне. Т.ч. если отсылать из фонового потока Post/SendMessage хэндлу окна, то всё ОК. Вариант с событием OnProgress у фонового потока и его обработчик - это верное решение. Только вот надо держать в уме, что обработчик вызывается в контексте другого потока - это не всегда получается.
...
Рейтинг: 0 / 0
25.06.2019, 15:14
    #39830381
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
25.06.2019 15:06, Василий 2 пишет:
> VCL не тред-сейф, а вот WinAPI вполне.

имеешь весьма поверхностные знания об архитектуре Вын.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.06.2019, 16:00
    #39830404
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
Обоснуй
...
Рейтинг: 0 / 0
25.06.2019, 17:02
    #39830430
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TThread -> ProgressBar -> Основная форма
25.06.2019 16:00, Василий 2 пишет:
> Обоснуй

начни с букварей.
практически вся низкоуровневая работа с GUI средствами WinAPI из разных потоков
требует от программера специальных танцев с бубнами.
в общем случае заявлять, что с многопоточностью там всё ув шуколаде,
мягко говоря, некорректно.

если интересны подробности, можно почитать статьи Раймонда Чена на эту тематику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TThread -> ProgressBar -> Основная форма / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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