Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.05.2012, 23:15
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
Лампочка Progressbar в listview

Прошу помощи!
программа принимает файлы от нескольких клиентов.
Хочу сделать в listview для каждого принимаемого файла progressbar.
Подскажите как, ведь из потока нельзя вызывать функцию с параметрами а как мне тогда к Progressbar обращаться????
Ответить с цитированием
  #2  
Старый 12.05.2012, 23:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
ведь из потока нельзя вызывать функцию с параметрами
Можно. Другое дело, что с точки зрения синхронизации не следует вызывать методы формы "прям так". Для этого есть метод Synchronize у класса TThread.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 12.05.2012, 23:38
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

я его так и Synchronize( Form1.Createprogress); Createprogress-процедура создания.
но я не могу передать этой процедуре параметр max
Ответить с цитированием
  #4  
Старый 13.05.2012, 00:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно сделать метод потока, который будет вызываться без параметров через Synchronize, а затем уже внутри будет вызываться нужная функция.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 13.05.2012, 00:21
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

Отлично!!!Получилось!!! СПАСИБО!!!

Извиняюсь но еще вопрос

Код создания progressbara

Код:
i:= Listview1.Items.Count;

   Listview1.Items.Add.Caption:=a;

   r:=Listview1.Items[i].DisplayRect(drBounds);

   pb:=TProgressBar.Create(Self);
   pb.Parent:=Listview1;

   pb.Position:=S;
   pb.Smooth:=true;

   Listview1.Items[i].Data:=pb;

lmikle: пользуемся тегами!!!

ну создаю я его а как мне теперь из потока передавать позицию

Последний раз редактировалось lmikle, 13.05.2012 в 00:41.
Ответить с цитированием
  #6  
Старый 13.05.2012, 01:11
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Так же. В Synchronize вызывать метод потока, который будет ставить его позицию в нужную.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 13.05.2012, 10:50
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

я это понимаю,но как мне в потоке узнать к какому progressbar обращаться ведь у меня для каждого потока создается свой progressbar и даже если поток будет знать то как мне через Listview1.Items[i].Data обратиться к progressbar.position
Ответить с цитированием
  #8  
Старый 13.05.2012, 14:52
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Так. По каким событиям должно меняться положение ProgressBar?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 13.05.2012, 18:44
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

процедура создания вызывается до этого кода когда поток определяет размер файла

Цитата:
while(nTotal < FileInfo.FileLength) do
begin

nToRead := (FileInfo.FileLength - nTotal);

if (nToRead > SizeOf(RcvBuf)) then
nToRead := SizeOf(RcvBuf);

nRead := SockStream.Read( RcvBuf, nToRead );
if (nRead = 0) then Exit;
nTotal := nTotal + nRead;
FileServer.ProgressBar1.Position:=nTotal;-здесь я меняю позицию прогрессбара
Application.ProcessMessages;
FileStream.Write( RcvBuf, nRead );
end;

но этот прогрессбар у меня создан на форме и он один для всех потоков.

код выше создает прогресбар для каждого потока и я не знаю как теперь к нему обращаться.

думаю что в процедуре создания прогрессбара нужно сделать передачу в поток вызвавший эту процедуру переменной I(Listview1.Items[i] ) но не знаю как сделать
Ответить с цитированием
  #10  
Старый 13.05.2012, 19:11
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
Вопрос

С обращением к прогрессбару разобрался вроде
Цитата:
pb:=TProgressBar(Listview1.Items[0].Data);
pb.Position:=pb.Position+20;
Думаю правильно.
но с передачей параметра I в поток не разобрался
Ответить с цитированием
  #11  
Старый 13.05.2012, 20:08
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Процедура создания ProgressBar вызывается в методе потока. Следовательно, можно сделать эту процедуру функцией, возвращаемым значением которой будет например его номер. Затем в потоке можно сохранить это значение (к примеру в переменной, являющимся полем собственного наследника класса TThread) и использовать далее.
Желательно обращение к ProgressBar сделать тоже через Synchronize, как и создание.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #12  
Старый 13.05.2012, 20:37
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

СПАСИБО!!!! сам чето не додумался! с потоками первый раз дело имею.
тока не пойму почему когда Listview прокручиваю progressbarы на месте стоят
Ответить с цитированием
  #13  
Старый 13.05.2012, 21:25
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

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

Последний раз редактировалось EL190, 13.05.2012 в 21:39.
Ответить с цитированием
  #14  
Старый 13.05.2012, 23:16
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Только что нашел метод Queue, который является асинхронным Synchronize.
Правда думаю, задержки по перерисовке ProgressBar - ничто по сравнению с задержками сети. Не факт, что вообще стоит это делать. Ведь всякие асинхронности тоже грузят процессор. Пока добавится в очередь, пока вытащится,...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 13.05.2012 в 23:40.
Ответить с цитированием
  #15  
Старый 14.05.2012, 19:05
EL190 EL190 вне форума
Новичок
 
Регистрация: 23.04.2012
Сообщения: 50
Репутация: 159
По умолчанию

если я правильно понял то при создании потока все функции потока записываются в него (типа нового utita) или нет??????

Последний раз редактировалось EL190, 14.05.2012 в 19:28.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter