Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.032 c