![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
CHERRY |
|
||||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
В разработке компонент «файловая панель» типа панель двухпанельного файлового менеджера. Для отображения файловой системы использую TvirtualStringTree.
Захотел добавить сканирование сети на предмет сетевого окружения. Создаем поток Thread :=TnetScanThread.Create(false), результат сканирования для отображения передается в процедуру AddElement
И вот здесь засада. Из класса TnetScanThread нет доступа к VST и другим экземплярам класса Tfm. В тестовом примере я писал Form1.VST.FullExpand(); А как поступить в компоненте? Выбился из сил. --------------------
Трясу надежды ветвь, но где желанный плод? |
||||
|
|||||
Агрох |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.4.2013 Где: Москва Репутация: 3 Всего: 6 |
Form1.Экземпляр_класса_TFm.VST.FullExpand();
--------------------
Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Я бы сделал классу потока событие.
Это событие вызывал бы в основном потоке (хотя бы через syncronize). А форма пусть после создания потока присвоит обработчик события и... делает там что захочет. Добавлено через 1 минуту и 10 секунд На всякий случай - напомню, что из потока обращаться к визуальным компонентам чревато боком, именно поэтому придумали всякие синхронайзы и т.п. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
я бы в класс потока передавал ссылку на VST и с помощью syncronize работал бы с VTS
|
|||
|
||||
CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Так формы нету! В тестовой программе с формой нет проблем.
Класс потока выглядит так:
Процедура Scan(Res: TNetResource; Root: boolean); сканирует сеть и через Synchronize(AddElement); выводит результат. Пробовал два варианта. 1. Без потока - программа замирает при сканировании сети, но работает. 2. Посылать результат из Scan(Res: TNetResource; Root: boolean) вместо Synchronize(AddElement) в TList, а в главном классе в цикле или по таймеру проверять TList на предмет данных и выводить в VST. Но как-то не кошерно. Вроде как и потока никаго нет. --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Не надо, чтобы поток чего-то там знал о форме/дереве и т.п. Он должен передать необходимую и достаточную информацию тому, кто знает о форме/дереве и в состоянии что-либо с ними и с информацией от потока сделать.
Это сообщение отредактировал(а) kami - 5.12.2013, 15:22 |
|||
|
||||
CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Поток оформил в виде класса в отдельном файле. Данные передаются через TList.
В принимающей программе в цикле
проверяем состояние потока и выводим данные частями, по мере заполнения списка. Рабочий проект прилагается (может кому сгодится). Буду рад советам. Спасибо за внимание. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Программа более свободна и управляема. Результат сканирования можно проверять реже раз в 2-3 сек или не проверять совсем. Закончился поток - получили результат. Но как узнать, что поток закончился не проверяя регулярно какие-либо данные? --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Поток по окончании работы может оповестить кого-то/чего-то. Способов предостаточно. Смотря кого/что оповещать.
|
|||
|
||||
CHERRY |
|
|||
![]() Прохожий ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 17.6.2002 Где: Одесса Репутация: нет Всего: -2 |
Да, можно выбросить сообщение об окончании, написать в статусбаре, выполнить процедуру и т.д. Просто в моем случае ожидать окончания потока скучно (у меня на работе 20 раб.станций+2 сервера). Сканирование может занимать некоторое время, особенно если часть машин недавно покинули сеть, поэтому последовательный вывод результатов приятнее бесконечного прогрессбара.=) Всем спасибо. --------------------
Трясу надежды ветвь, но где желанный плод? |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Так в чем проблема в рамках той же самой synhronize заполнять список из потока?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |