Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

D5 vs D7, Threads, EThread Exception   Найти похожие ветки 

 
zapped ©   (2003-11-04 12:29) [0]

Люди, скажите! Может ли быть такое, что потоки на базе TThread в D5 и D7 отличаются по реализации?
а если короче, то код следующий

unit Unit2;

interface

uses
Classes;

type
TTestThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
constructor Create; reintroduce;
end;

implementation

{ TestThread }

constructor TTestThread.Create;
begin
FreeOnTerminate := true;
end;

procedure TTestThread.Execute;
begin
{ Place thread code here }
end;

end.


по нажатию кнопки делаем следующее

procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestThread.Create do
WaitFor;
end;


Если компилировать в Д5, выполняется без ошибок. Если компилировать в D7, то при нажатии на педаль, выдаётся ошибка ThreadError: неверный дескриптор(6).
Почему так? Прошу не предлагать этот трабл обойти (я и сам вроде с усам), а почему ТАК?


 
han_malign ©   (2003-11-04 12:53) [1]

Как раз в D5 - выполянется с ошибкой - тебе не говорят, что ты лох...

inherited Create(false{или true}); - не судьба вызвать?


 
zapped ©   (2003-11-04 13:09) [2]

у меня - не выдаёт :)))
и да, прощу прощения :)))
забыл :))
constructor TTestThread.Create;
begin
inherited Create(true);
FreeOnTerminate := true;
Resume;
end;


всё равно, то же самое :)))


 
Erik ©   (2003-11-04 13:50) [3]

Напиши if not Suspended then WaitFor;


 
han_malign ©   (2003-11-04 13:53) [4]

procedure TTestThread.Execute;
begin
{ Place thread code here }
end;
..............
procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestThread.Create do
WaitFor;
end;

- вообще говоря, ты вызываешь WaitFor у уже уничтоженного объекта(фактически он уничтожаeтся на Resume). AV не получается, только из-за того, что память, на самом деле, не освобождается, а просто помечается в Borland-овом диспетчере памяти как свободная, но Handle потока уже освобожден... А в D5, как раз, имел место глюк с FreeOnTerminate и Suspended, исправленный в дальнейшем.


 
panov ©   (2003-11-04 13:55) [5]

Неправильно используешь.

Правильный пример:

constructor TTestThread.Create;
begin
inherited Create(true);
FreeOnTerminate := False; //или вообще убираем строку
Resume;
end;


Теперь твой код будет работать на ура-):

procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestThread.Create do
WaitFor;
Free;
end;


 
zapped ©   (2003-11-04 14:04) [6]

2 han_malign © (04.11.03 13:53) [4]
ага, пасиба...


 
zapped ©   (2003-11-04 14:17) [7]

2 panov © (04.11.03 13:55) [5]
я бы не сказал :)))
зачем оно тогда вообще есть, свойство FreeOnTerminate? :)))
хотя, надо признаться, что так работает корректно


 
han_malign ©   (2003-11-04 14:58) [8]

>зачем оно тогда вообще есть, свойство FreeOnTerminate?
- как раз, для того случая, когда не нужно следить за состоянием потока, и про него можно "забыть", зная что он сам освободит память... А если WaitFor, то это уже совсем другой случай.


 
zapped ©   (2003-11-04 16:41) [9]

2 han_malign © (04.11.03 14:58) [8]

> А если WaitFor, то это уже совсем другой случай.

Хммм... не знал, не думал, не гадал



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-41409
Norfolk
2003-10-29 15:10
2003.11.13
Преобразование типов либо запись в файл


3-41041
diww
2003-10-14 16:38
2003.11.13
Помогите с запросом


1-41308
SergeyVMM
2003-10-31 10:57
2003.11.13
Ресурсы


1-41485
PN Soft
2003-10-28 13:28
2003.11.13
PChar=>String


3-40845
Denisiy
2003-10-21 16:16
2003.11.13
Как передать в переменную резльтат запроса от Query?