Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2016, 15:11   #1
factually
Пользователь
 
Регистрация: 24.10.2016
Сообщений: 21
По умолчанию Синхронизация Progressbar с потоком

Как грамотно синхронизировать Progressbar с потоком? Какие есть способы? Необходимо, чтобы Progressbar загружался в зависимости от времени выполнения потока.
Пробую так:
Код:
if sProgressBar1.Position < sProgressBar1.Max then
sProgressBar1.Position:=sProgressBar1.Position+1;
В начале и в конце потока старт и стоп таймера. Проблема в том, что если поток выполняется быстро, то Progressbar не успевает дойти до 100%, а доходит только до 30% например. Или наоборот, если поток долго выполняется, то Progressbar висит на 100% пока поток не закончит работу. Хотелось бы, чтобы Progressbar загружался плавно на протяжении всего потока до 100%.
factually вне форума Ответить с цитированием
Старый 06.11.2016, 15:31   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Код давай.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 06.11.2016, 16:03   #3
factually
Пользователь
 
Регистрация: 24.10.2016
Сообщений: 21
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
Код давай.
Код:
procedure Thread.Execute;
i:integer;
begin
 form1.tmr1.enabled:=true;
for i:=0 to 16 do begin
form1.memo1.lines.add('score '+inttostr(i));
end;
  Form1.tmr1.Enabled:= false;
 form1.memo1.lines.add('completed 100%');
end;

Последний раз редактировалось factually; 06.11.2016 в 16:22.
factually вне форума Ответить с цитированием
Старый 06.11.2016, 16:14   #4
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

1. При оформлении кода используй кнопочку # в редакторе (крайняя справа)
2. Это то, ради чего нужно Прогрессбар заводить? Не дать заснуть пользователю, пока 17 строк Мемо заполняются? Какая задача-то стоит?
3. Работать с визуальными компонентами из левого потока так, как ты делаешь, мягко говоря неправильно. Читай про метод Synchronize (например, тут).

З.Ы. И вообще, откуда узнать априори, сколько времени займет выполнение потока? Не лучше ли привязаться к количеству фактически обработанной информации?
Программирую по необходимости

Последний раз редактировалось tsar_; 06.11.2016 в 16:20.
tsar_ вне форума Ответить с цитированием
Старый 06.11.2016, 16:20   #5
factually
Пользователь
 
Регистрация: 24.10.2016
Сообщений: 21
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
1. При оформлении кода используй кнопочку # в редакторе (крайняя справа)
2. Это то, ради чего нужно Прогрессбар заводить? Не дать заснуть пользователю, пока 17 строк Мемо заполняются? Какая задача-то стоит?
3. Работать с визуальными компонентами из левого потока так, как ты делаешь, мягко говоря неправильно. Читай про метод Synchronize (например, тут).
2. Код выше для примера. Что необходимо написал еще выше.
3. Знаю, но тут суть не в этом, просто пытаюсь понять как грамотно засинхронить прогрессбар с потоком. В коде может быть что угодно, запросы в веб и пр.

Цитата:
Сообщение от tsar_ Посмотреть сообщение
З.Ы. И вообще, откуда узнать априори, сколько времени займет выполнение потока? Не лучше ли привязаться к количеству фактически обработанной информации?
Если бы знал, то не спрашивал бы) Если фактически обрабатывать, то получится слишком много лишнего кода и не всегда точный результат.

Последний раз редактировалось factually; 06.11.2016 в 16:28.
factually вне форума Ответить с цитированием
Старый 06.11.2016, 16:39   #6
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Ну вот отправили запрос на сервер... Откуда знать, когда ответ придет?

Общий рецепт мне не известен, но зная специфику задачи можно как-то выкрутиться.
Например если имеем дело с обработкой большого количества однотипной информации (та же запись строк в мемо), то на основе анализа времени выполнения одной/нескольких последовательных операций нужно пробовать предсказать время выполнения оставшихся операций... Но опять же нужно заранее знать объем предстоящих операций.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 06.11.2016, 16:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Прогрессбар есть смысл применять если заранее можно хотя-бы примерно оценить что будет выполняться. А так только пользователя в заблуждение будет вводить. И не обязательно из потока его дергать, можно просто форме из потока сообщения посылать с процентом выполнения и пусть она дергает свой прогрессбар
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.11.2016, 08:08   #8
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от factually Посмотреть сообщение
Код:
procedure Thread.Execute;
i:integer;
begin
 form1.tmr1.enabled:=true;
for i:=0 to 16 do begin
form1.memo1.lines.add('score '+inttostr(i));
end;
  Form1.tmr1.Enabled:= false;
 form1.memo1.lines.add('completed 100%');
end;
Этот код для примера? Веду к тому, что запускать некий таймер из потока неправильно. Дайте развернутую инфу, что вы хотите делать в потоке.
Грузить из базы в несколько потоков ?
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоком nibufep Общие вопросы Delphi 4 09.09.2015 14:32
Скачать потоком с ProgressBar SawaMEN Общие вопросы Delphi 7 06.12.2013 12:50
Проблема с потоком Aleksandr Общие вопросы Delphi 1 28.03.2013 18:45
Проблема с потоком! vovken1997 Общие вопросы Delphi 2 12.04.2012 21:21
Проблема с потоком Araver Общие вопросы Delphi 4 16.10.2007 04:30