Главная страница
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.022 c
3-41046
GAlexis
2003-10-24 14:54
2003.11.13
Управление пользователями


1-41445
han-bratan
2003-11-04 11:00
2003.11.13
Транскрипция


1-41240
Doctor Deejay
2003-11-01 10:38
2003.11.13
ComboBox Больше! Еще больше!


14-42057
Sir Alex
2003-10-15 12:31
2003.11.13
Проблемка с Access и MS SQL server


3-40940
Chaked
2003-10-24 22:40
2003.11.13
Что за глюк с русскоязычными записями???