Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в визуальном компоненте, Доступ к экземплярам класса 
:(
    Опции темы
CHERRY
Дата 5.12.2013, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



В разработке компонент «файловая панель» типа панель двухпанельного файлового менеджера. Для отображения файловой системы использую  TvirtualStringTree. 
Код

//Класс сканирования сети
  TNetScanThread = class(TThread)
  private
…...................... 
  protected
    procedure Execute; override;
    procedure Scan(Res: TNetResource; Root: boolean);
    procedure AddElement;
    procedure Stop;
  end;  

//Класс файловая панель
  TFm = class(TWinControl)
  private
    { Private declarations }
    VST:TVirtualStringTree;   
    Thread :TnetScanThread;
….......................
  End;


Захотел добавить сканирование сети на предмет сетевого окружения. Создаем поток   
Thread :=TnetScanThread.Create(false), 
результат сканирования для отображения передается в процедуру  AddElement
Код

procedure TNetScanThread.AddElement;
Var
  Data: PFMItem;
begin
  VST.FullExpand();
 …..........
End;


И вот здесь засада. Из класса  TnetScanThread нет доступа к  VST и другим экземплярам класса Tfm. В тестовом примере я писал Form1.VST.FullExpand(); А как поступить в компоненте? Выбился из сил.


--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Агрох
Дата 5.12.2013, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 3
Всего: 6



Form1.Экземпляр_класса_TFm.VST.FullExpand();
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
kami
Дата 5.12.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Я бы сделал классу потока событие.
Это событие вызывал бы в основном потоке (хотя бы через syncronize).
А форма пусть после создания потока присвоит обработчик события и... делает там что захочет.

Добавлено через 1 минуту и 10 секунд
На всякий случай - напомню, что из потока обращаться к визуальным компонентам чревато боком, именно поэтому придумали всякие синхронайзы и т.п.
PM MAIL WWW   Вверх
Akella
Дата 5.12.2013, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



я бы в класс потока передавал ссылку на VST и с помощью  syncronize работал бы с VTS

Код

type
  TYrlThread = class(TThread)
  private
...
  procedure UpdateImage;

  public
...
....
    property ImageInProcess: TcxImage read fImageInProcess write fImageInProcess;
...
end;

...
...

      while not Terminated do
      begin
        Synchronize(UpdateImage);



...
...


procedure TYrlThread.UpdateImage;
begin
  if Assigned(fImageInProcess) then
    чегой-то делаем с fImageInProcess;
end;


PM MAIL   Вверх
CHERRY
Дата 5.12.2013, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Так формы нету! В тестовой программе с формой нет проблем.
Класс потока выглядит так:
Код

  TNetScanThread = class(TThread)
  private
    TreeNetWrk: PVirtualNode;
    TreeDomain: PVirtualNode;
    TreeServer: PVirtualNode;
    TreeShares: PVirtualNode;
    Param_dwType: Byte;
    Param_dwDisplayType: Byte;
    Param_lpRemoteName: String;
    Param_lpIP: String;
    StopScan:Boolean;
  protected
    procedure Execute; override;
    procedure Scan(Res: TNetResource; Root: boolean);
    procedure AddElement;
    procedure Stop;
  end;

Процедура Scan(Res: TNetResource; Root: boolean); сканирует сеть и через
Synchronize(AddElement); выводит результат.
Пробовал два варианта.
1. Без потока - программа замирает при сканировании сети, но работает.
2. Посылать результат из Scan(Res: TNetResource; Root: boolean) вместо Synchronize(AddElement)
в TList, а в главном классе в цикле или по таймеру проверять TList на предмет данных и выводить в VST.
Но как-то не кошерно. Вроде как и потока никаго нет.

--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
kami
Дата 5.12.2013, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Не надо, чтобы поток чего-то там знал о форме/дереве и т.п. Он должен передать необходимую и достаточную информацию тому, кто знает о форме/дереве и в состоянии что-либо с ними и с информацией от потока сделать.

Это сообщение отредактировал(а) kami - 5.12.2013, 15:22
PM MAIL WWW   Вверх
CHERRY
Дата 6.12.2013, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Поток оформил в виде класса в отдельном файле. Данные передаются через TList.
В принимающей программе в цикле
Код

  n1:=0;
  while not Thread.Stopped do
  Begin
     sleep(500);
    //Выводим найденные данные частями
    n2:=Thread.fNetScanInfo.Count;
     DisplayNetScanResult(n1,n2);
    n1:=Thread.fNetScanInfo.Count;
  End;

проверяем состояние потока и выводим данные частями, по мере заполнения списка.
Рабочий проект прилагается (может кому сгодится). Буду рад советам.
Спасибо за внимание.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  ScanNetWork.7z 449,31 Kb
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
kami
Дата 6.12.2013, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(CHERRY @  6.12.2013,  13:36 Найти цитируемый пост)
В принимающей программе в цикле

В чем тогда отличие от сканирования в основном потоке, если хоть так, хоть эдак "принимающая программа" висит в цикле, пока поток не отработает?
PM MAIL WWW   Вверх
CHERRY
Дата 6.12.2013, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Цитата(kami @  6.12.2013,  11:40 Найти цитируемый пост)
В чем тогда отличие от сканирования в основном потоке,


Программа более свободна и управляема. Результат сканирования можно проверять реже  раз в 2-3 сек или не проверять совсем. Закончился поток - получили результат. Но как узнать, что поток закончился не проверяя регулярно какие-либо данные? 
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
Akella
Дата 7.12.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Поток по окончании работы может оповестить кого-то/чего-то. Способов предостаточно. Смотря кого/что оповещать.
PM MAIL   Вверх
CHERRY
Дата 7.12.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Прохожий
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 17.6.2002
Где: Одесса

Репутация: нет
Всего: -2



Цитата(Akella @  7.12.2013,  08:49 Найти цитируемый пост)
Поток по окончании работы может оповестить кого-то/чего-то.

Да, можно выбросить сообщение об окончании, написать в статусбаре, выполнить процедуру и т.д. 
Просто в моем случае ожидать окончания потока скучно (у меня на работе 20 раб.станций+2 сервера). Сканирование может занимать некоторое время, особенно если часть машин недавно покинули сеть, поэтому последовательный вывод результатов приятнее бесконечного прогрессбара.=)

Всем спасибо.
--------------------
Трясу надежды ветвь, но где желанный плод?
PM MAIL WWW   Вверх
kami
Дата 7.12.2013, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(CHERRY @  6.12.2013,  23:02 Найти цитируемый пост)
Программа более свободна и управляема.

Ну да, Sleep(500), конечно, неизмеримо повышает свободу и управляемость основного потока.
PM MAIL WWW   Вверх
Akella
Дата 9.12.2013, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Так в чем проблема в рамках той же самой synhronize заполнять список из потока?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1275 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.