![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Прошу помощи!
программа принимает файлы от нескольких клиентов. Хочу сделать в listview для каждого принимаемого файла progressbar. Подскажите как, ведь из потока нельзя вызывать функцию с параметрами а как мне тогда к Progressbar обращаться???? |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
я его так и Synchronize( Form1.Createprogress); Createprogress-процедура создания.
но я не могу передать этой процедуре параметр max |
|
#4
|
||||
|
||||
|
Можно сделать метод потока, который будет вызываться без параметров через Synchronize, а затем уже внутри будет вызываться нужная функция.
|
|
#5
|
|||
|
|||
|
Отлично!!!Получилось!!! СПАСИБО!!!
Извиняюсь но еще вопрос Код создания 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
|
||||
|
||||
|
Так же. В Synchronize вызывать метод потока, который будет ставить его позицию в нужную.
|
|
#7
|
|||
|
|||
|
я это понимаю,но как мне в потоке узнать к какому progressbar обращаться ведь у меня для каждого потока создается свой progressbar и даже если поток будет знать то как мне через Listview1.Items[i].Data обратиться к progressbar.position
|
|
#8
|
||||
|
||||
|
Так. По каким событиям должно меняться положение ProgressBar?
|
|
#9
|
|||
|
|||
|
процедура создания вызывается до этого кода когда поток определяет размер файла
Цитата:
но этот прогрессбар у меня создан на форме и он один для всех потоков. код выше создает прогресбар для каждого потока и я не знаю как теперь к нему обращаться. думаю что в процедуре создания прогрессбара нужно сделать передачу в поток вызвавший эту процедуру переменной I(Listview1.Items[i] ) но не знаю как сделать |
|
#10
|
|||
|
|||
|
С обращением к прогрессбару разобрался вроде
Цитата:
но с передачей параметра I в поток не разобрался |
|
#11
|
||||
|
||||
|
Процедура создания ProgressBar вызывается в методе потока. Следовательно, можно сделать эту процедуру функцией, возвращаемым значением которой будет например его номер. Затем в потоке можно сохранить это значение (к примеру в переменной, являющимся полем собственного наследника класса TThread) и использовать далее.
Желательно обращение к ProgressBar сделать тоже через Synchronize, как и создание. |
|
#12
|
|||
|
|||
|
СПАСИБО!!!! сам чето не додумался! с потоками первый раз дело имею.
тока не пойму почему когда Listview прокручиваю progressbarы на месте стоят |
|
#13
|
|||
|
|||
|
еще вопросец как из потока вызвать функцию формы и не дожидаться ее завершения
А то как то нехорошо получается -поток файл принимает и должен ждать завершения заполнения прогрессбара Последний раз редактировалось EL190, 13.05.2012 в 21:39. |
|
#14
|
||||
|
||||
|
Только что нашел метод Queue, который является асинхронным Synchronize.
Правда думаю, задержки по перерисовке ProgressBar - ничто по сравнению с задержками сети. Не факт, что вообще стоит это делать. Ведь всякие асинхронности тоже грузят процессор. Пока добавится в очередь, пока вытащится,... Последний раз редактировалось Bargest, 13.05.2012 в 23:40. |
|
#15
|
|||
|
|||
|
если я правильно понял то при создании потока все функции потока записываются в него (типа нового utita) или нет??????
Последний раз редактировалось EL190, 14.05.2012 в 19:28. |