Auslogics: работа и отзывы о работе
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

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

Перейти вниз

Пример кода №7 Empty Пример кода №7

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

Код:

const
ThreadSuccess= 9;
ThreadError=  -1;
type
TThumbsThread = class(TThread)
protected
procedure Execute;  override;
end;

procedure TThumbsThread.Execute;
begin
ReturnValue:=0;
try
...
ReturnValue := ThreadSuccess;
except
ReturnValue := ThreadError;
end;
end;

procedure TMainForm.RedrawThumbnails();
begin
...
if Assigned(ThumbsThread) then
begin
ThumbsThread.Terminate;
while (ThumbsThread.WaitFor= 0) do
Application.ProcessMessages;
ThumbsThread:= nil;
end;
ThumbsThread:= TThumbsThread.Create(true);
ThumbsThread.FreeOnTerminate:= false;
...
ThumbsThread.Resume;
...
end;

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

- Цикл ожидания с проверкой результата выполнения функции WaitFor нелогичен и, в случае ошибки выполнения потока, приведет просто к зависанию приложения, т.к. функция WaitFor блокирует выполнение, ожидает завершение потока и возвращает результат работы потока. Т.е. значение, возвращаемое функцией WaitFor, с течением времени не меняется. К тому же, сам цикл в данном случае нелогичен, т.к. он не выполняется (функция блокирует выполнение до завершения потока).

- Непонятно и нелогично использование свойства потока ReturnValue, т.к. оно фактически нигде не используется (только для цикла с проверкой WaitFor, о чем написано в предыдущем пункте).

- Объекты типа TThumbsThread никогда не освобождаются, при этом создаются в больших количествах, что приводит к утечкам памяти.
Marina-T
Marina-T
Admin

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

https://auslogics.forum2x2.ru

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

Вернуться к началу


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