Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно прекратить работу потока? [D7, Win95/98, WinXP]


Kolan ©   (2005-07-28 11:44:00) 

Здравствуйте,
 Нашел ошибку у себя, исправить не могу.
Шошибка такая.
1. Я создаю поток
MeasurmentThread := TMeasurmentThread.Create(False, MeasurmentDataRec, Handle);

2. Он делает что ему надо и затем его надо удалить. Удаляю так
 if MeasurmentThread <> nil then
   MeasurmentThread.Terminate;


3. Ошибкак в том что при следующем использовании потока (1).
Указатель на старую его версию теряется.

Значит его надо удалять?

procedure TerminateMeasurmentThread;
begin
 if MeasurmentThread <> nil then
 begin
   MeasurmentThread.Terminate;
   MeasurmentThread.Free;
 end;
end;

Получаю:
Thread Error: Неверный дескриптор (6)

Пробую так:
procedure StartMeasurmentThread(MeasurmentDataRec: PMeasurmentData; Handle: THandle);
begin
 if  Assigned(MeasurmentThread) then
 begin
   MeasurmentThread.Free;
 end;
   MeasurmentThread := TMeasurmentThread.Create(False, MeasurmentDataRec, Handle);
end;

Получаю:

Access violation at address 00403740 in module 'KFREGRAF.EXE'. Read of address FFFFFFFC

А как надо то?


Digitman   (2005-07-28 12:48:00) [1]


> мне не надо волноваться что я затру указатель на сущ. обект?


да, не надо


Digitman   (2005-07-28 12:46:00) [2]

constructor TMeasurmentThread.Create(CreateSuspended: Boolean;
MeasurmentDataRec: PMeasurmentData; Handle: THandle);
begin
inherited Create(True);
FMeasurmentDataRec := MeasurmentDataRec;
FWindowHandle := Handle;
OnTerminate := DoOnTerminate;
if not CreateSuspended then Resume;
end;

procedure TMeasurmentThread.DoOnTerminate(Sender: TObject);
begin
 ShowMessage('Done');
end;

procedure StartMeasurmentThread(MeasurmentDataRec: PMeasurmentData; Handle: THandle);
begin
  MeasurmentThread := TMeasurmentThread.Create(False, MeasurmentDataRec, Handle);
end;

procedure TerminateMeasurmentThread;
begin
 FreeAndNil(MeasurmentThread);
end;

procedure ReStartMeasurmentThread(MeasurmentDataRec: PMeasurmentData; Handle: THandle);
begin
  TerminateMeasurmentThread;
  StartMeasurmentThread(MeasurmentDataRec, Handle);
end;


Kolan   (2005-07-28 12:45:00) [3]

ты записывал в эту переменную nil ? нет, не записывал... Ну так а откуда ж там nil сам по себе возьмется-то ? с Луны что ли свалится ?)

Те при
FreeOnTerminate := True;
когда я делаю потоку терминате память освобождается? Так. И мне не надо волноваться что я затру указатель на сущ. обект?


Digitman   (2005-07-28 12:36:00) [4]


> После уничтожения(Terminate). Захожу отладчиком в StartMeasurmentThread
> там
> MeasurmentThread
> MeasurmentThread: ($10, 76)
> те не nil


а почему там д.б. nil ?

ты записывал в эту переменную nil ? нет, не записывал... Ну так а откуда ж там nil сам по себе возьмется-то ? с Луны что ли свалится ?)


Kolan   (2005-07-28 12:20:00) [5]

св-во FreeOnTerminate явно устанавливаешь ?
если да, то где и какое значение ему присваиваешь
?

Забsл но вот исправил:

constructor TMeasurmentThread.Create(CreateSuspended: Boolean;
 MeasurmentDataRec: PMeasurmentData; Handle: THandle);
begin
 inherited Create(CreateSuspended);
 FMeasurmentDataRec := MeasurmentDataRec;
 FWindowHandle := Handle;
 FreeOnTerminate := True;
 //MeasurmentThread.OnTerminate := MeasurmentThread.DoTerminate;
end;


После уничтожения(Terminate). Захожу отладчиком в StartMeasurmentThreadтам
MeasurmentThread
MeasurmentThread: ($10, 76)
те не nil

Благодарю за помощь ШО'б я без вас делал. :)))


Digitman   (2005-07-28 11:55:00) [6]


> Kolan ©   (28.07.05 11:44)  


св-во FreeOnTerminate явно устанавливаешь ?
если да, то где и какое значение ему присваиваешь ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо