Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многопоточность в DLL, отрисовка в приложении


Страницы:   1 2

sally ©   (2006-01-12 18:40:00) 

Есть класс от TThread. Класс простейший: поиск файлов по диску. Отображать необходимо текущий файл и отрисовывать необходимую информацию. Но есть "но": передавать при создании объетка Canvas нельзя. Для "визуализации" процесса нужно использовать интерфейсы.

 IVisualizer = interface
   procedure Progress(AFile: string);
 end;

 TFileSearch = class(TThread)
 private
   FVisualizer: IVisualizer;
 protected
   procedure DoVisualize;
   procedure BuildFileList(const APath: string);
   procedure Execute; override;
 public
   constructor Create(AVisualizer: IVisualizer; const APath: string);
 end;

 TVisualizer = class(TForm, IVisualizer)
   procedure Progress(AFile: string);
 end;

procedure TFileSearch.Execute;
begin
 BuildFileList(FPath);
end;

procedure TFileSearch.BuildFileList(const APath: string);
...
begin
 ....
 /// Поиск файлов
  Synchronize(Draw);
  ....
end;

procedure TFileSearch.Draw;
begin
 // Если использовать просто напрямую Canvas, то все ок
 // Canvas.TextOut(10, 100, CurrentFile);
 //
 FVisualizer.Progress(CurrentFile);
 // При таком варианте возникает Exception
end;

procedure TForm1.Progress(AFile: string);
begin
 Canvas.TextOut(10, 100, AFile);
end;

Реально ли эту проблему обойти? Если да, то как?


simpson   (2006-01-12 21:03:00) [21]

IMHO, изврат полный.

Есть IVisualizer. Ну и пусть его реализация думает, как вывести информацию на форму. Никакого использования Synchronize здесь быть не должно. Все действия по синхронизации - только в IVisualizer.Progress.

В качестве обоснования приведу пример - завтра тебе сказали выводить информацию не на форму, а, скажем, в файл. Здесь уже синхронизация с VCL-потоком не нужна, а никуда не денешься - она у тебя жестко прибита.

Или твой поток из GUI-приложения перекочевал в сервис. То же самое.

Ни о каких Canvas поток, производящий поиск файлов, конечно же, знать не должен. "Мухи отдельно - котлеты отдельно". (С)

По поводу Exception - давай текст исключения, тип исключения и код реализации IVisualizer. Телепатически сегодня не угадыватеся что-то.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо