|
#1
|
|||
|
|||
Потоки
Извиняюсь если не там тему создал.
Делаю подобие vk клиента, и там есть функции: procedure RefreshMySmallProfile; procedure ShowFriends(online:boolean) procedure SetStatus(text:string); Хочу выполнять эти функции в отдельном потоке. Но вопрос как передать в поток функции, хотелось бы что-то на подобие этого: Thread.Create(ShowFriends(true)); Каким образом можно это реализовать? П.С. На форме есть СкроллБокс, на нем лежит Image с фоном, поверх скроллбокса создаются панели FriendBox(TPanel) по кл-ву друзей, на нем там еще label с именем и т.п. В итоге пока грузится список друзей, стираются старые panel, рисуются новые, а их около 100, Мы имеем белый фон, Хотелось бы вытащить Image поверх белого фона, и нарисовать на нем: "идет загрузка" и т.п., Каким образом можно вытащить Image поверх, BringToFront не помогает, вот думаю может на канве рисовать или не получится, у кого-нибуть есть соображения. Буду очень признателен за помощь. |
#2
|
|||
|
|||
По поводу потоков. А что, сделать 3 типа потока (по потоку для каждой функции) и запускать нужное кол-во потоков нельзя? Каждый поток - это отдельный объект. Так что никаких проблем быть не должно. Ну и не забываем про синхронизацию.
По поводу картинок ничего не понял... |
#3
|
||||
|
||||
я передаю переменные в поток, например число
а там уже Код:
case nomer of 1: 2: 3: ... |
#4
|
|||
|
|||
поток для кажой функции не пойдет, так как этих функций щас 3, в итогеих будет пару десятков минимум, просто мне нужно чтобы это же функция выполнилась в потоке, а не тормозила работу с формой, насчет картинок, завтра скрины выложу, чтоб понятней было
|
#5
|
|||
|
|||
Решил на данный момент разработки отказаться от потока, всеравно секундную загрузки списка друзей пользователь в состоянии подождать.
Далее по картинкам, на этапе разработки это выглядит так: Тут видно что по серединке лежит 3 image 'а, по серединке тот который мне нужен, лежит он на scrollBox, далее на на скроле я создаю панельки с друзьями и т.п., вот как это вглядит: в ок, но во время прорисовки, несколько секунд создается такая фигня: Видите, белый фон, а мне бы хотелось на время прорисовки поднять картинку поверх, тоесть загородить белую фигню, в идеале бы в начале процедуры прорисовки написать Image1.BringToFront; а в конце Image1.SendToBack; Но это к сожалению не проходит(( а на месте белой фигни у меня должен быть мой фон и значок загрузки. |
#6
|
|||
|
|||
Проблема решена, тему можно закрывать...
|
#7
|
|||
|
|||
Ой, ошибся, проблему так и не решил.
пробовал перед рисованием на скроллбоксе ставить ScrollBox.visible:=false; и ScrollBox.parent:=nil; а потом уже ShowFriends; но прикол в том, что они обрабатываются позже чем ShowFriends и в итоге получаю окно как на третьем скрине, кто-нибуть может подсказать как решить... |
#8
|
|||
|
|||
Грузить все в отдельном потоке в некоторый буфер, а потом из этого буфера просто отрисовывать.
По поводу потоков - а что мешает просто передавать указатель на функцию внутрь потока? |
#9
|
|||
|
|||
по поводу указателя на функцию, отличная идея, спасибо за совет, попробую руализовать, а насчет "Грузить все в отдельном потоке в некоторый буфер, а потом из этого буфера просто отрисовывать." немного не понял... и вообще с технической точки зрения моего вопроса, почему visible:=false; выполняется после, может можно как то скрыть эту прорисовку...
|
#10
|
|||
|
|||
Код:
Visible := False; Application.ProcessMessages; Т.к. выполнение идет в главном потоке, приложение просто не успевает обработать сообщения, стоящие в очереди. ProcessMessages принудительно заставляет обработать очередь сообщений. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Kingcss (25.01.2012)
|
#11
|
|||
|
|||
lmikle огромное спасибо, получилось и с потоком и с ScrollBox. Очень благодарен за вашу помощь
|