![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многопоточность в DLL, отрисовка в приложении
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. Телепатически сегодня не угадыватеся что-то.