![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно прекратить работу потока? [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 явно устанавливаешь ?
если да, то где и какое значение ему присваиваешь ?