Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-42228
DillerXX
2003-09-16 21:53
2003.11.13
Dll


1-41231
Pomashok
2003-11-01 11:18
2003.11.13
Hint


6-41814
SergP
2003-09-15 13:11
2003.11.13
Как работать с SOCKS?


1-41462
TRyaSS
2003-10-29 09:37
2003.11.13
Загрузка программ


4-42310
JS
2003-09-06 17:07
2003.11.13
Прозрачный bitmap в меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский