Пример кода №8

Предыдущая тема Следующая тема Перейти вниз

Пример кода №8

Сообщение автор Marina-T в Чт Ноя 05, 2015 10:44 pm

Код:

type
TFindPictures = class(TThread)
private
procedure AddPicture(Name : string; aIndex : Integer);
protected
procedure Execute; override;
end;

procedure TFindPictures.Execute;
var
SearchRec : TSearchRec;
ThumbImage : TGPImage;
ImageIndex : Integer;
begin
FindFirst(Directory + '\*.*',  faAnyFile, SearchRec);
if SearchRec.Name <> '' then
begin
repeat
if isPicture(SearchRec.Name) then
begin
ThumbImage := CreateThumb(IncludeTrailingPathDelimiter(Directory)
+ SearchRec.Name);
ImageIndex := AddThumbInList(ThumbImage);
AddPicture(SearchRec.Name, ImageIndex);
end;
until ((FindNext(SearchRec) <> 0) or Terminated)
end;
FindClose(SearchRec);
end;

procedure TFindPictures.AddPicture(Name: string; aIndex : Integer);
var
Picture : TListItem;
begin
Picture := ListView.Items.Add;
Picture.Caption := Name;
Picture.ImageIndex := aIndex;
end;

type
TListViewThread = class(TListView)
protected
FindPicture : TFindPictures;
public
procedure DirectoryChange(var Msg : TMessage); message WM_DIRECTORY_CHANGE;
end;

procedure TListViewThread.DirectoryChange(var Msg: TMessage);
var
CurrentDirectory : string;
begin
CurrentDirectory := PChar(Pointer(Msg.LParam));
Self.Items.Clear;
if Assigned(FindPicture) then
FindPicture.Terminate;
FindPicture := TFindPictures.Create(CurrentDirectory, Self);
FindPicture.Resume;
end;

Данный код содержит несколько ошибок работы с потоками, что свидетельствует о неполных знаниях в данной теме:

- Объекты типа TFindPictures никогда не освобождаются, но создаются при каждой смене директории, что приводит к утечкам памяти.

- При завершении работы приложения не выполняется остановка потока, что может привести к очень долгой выгрузке приложения из памяти, в случае большого количества графических файлов в папке (приложение не завершится, пока не будут загружены все файлы из папки).

- При прерывании потока нет ожидания его завершения, поэтому, в случае переключения на другую папку, когда чтение файлов еще не завершено, поток будет еще выполнятся, и добавит в список отображения последний обрабатываемый файл.

- Работа с GUI компонентами из потока не синхронизирована, что может приводить к различным ошибкам в работе приложения.
avatar
Marina-T
Admin

Сообщения : 33
Дата регистрации : 2015-11-04
Возраст : 31

Посмотреть профиль http://auslogics.online-talk.net

Вернуться к началу Перейти вниз

Re: Пример кода №8

Сообщение автор SmartGuy в Пн Ноя 23, 2015 10:10 pm

Ошибок можно избежать и упростить код:
Код:
 procedure TForm1.FormCreate(Sender: TObject); begin TThread.CreateAnonymousThread( procedure begin .... TThread.Synchronize(nil, procedure begin ... end); end).Start; end; или так: procedure TForm1.FormCreate(Sender: TObject); var Task: ITask; begin > Task := TTask.Create( procedure begin .... TThread.Synchronize(nil, procedure begin ... end); end); Task.Start; end;

SmartGuy

Сообщения : 5
Дата регистрации : 2015-11-20

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №8

Сообщение автор DELPHI team Auslogics в Вт Ноя 24, 2015 10:42 pm

Ошибок не только можно избежать, а и нужно, но и это, снова, пример неправильного использования.
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №8

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения