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