Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.022 c
14-41970
Daniel
2003-10-19 12:31
2003.11.13
Есть ли способ


14-41898
Dima_dvp
2003-10-23 21:54
2003.11.13
К вопросу об оптимизации при работе с WinAPI


7-42193
alexsandri
2003-08-22 21:11
2003.11.13
Беда такая : Есть Большая куча Mp3 dв одной папке необходимо расс


4-42233
Sliski Slimak
2003-09-01 22:42
2003.11.13
Как эмулировать нажатие PrintScreen в системе?


3-40913
Behemoth
2003-10-20 10:52
2003.11.13
Как задать диапазон в SQL?




   Наверх