Пример кода №8
Участников: 3
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Пример кода №8
- Код:
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 компонентами из потока не синхронизирована, что может приводить к различным ошибкам в работе приложения.
Re: Пример кода №8
Ошибок можно избежать и упростить код:
- Код:
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- Сообщения : 11
Дата регистрации : 2015-11-21
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|