Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

Работа с потоками. Остановка потока.   Найти похожие ветки 

 
Ил_204   (2003-12-19 15:33) [0]

Работаю с потоками.
В методе Execute делаю FreeOnTerminate := True. Когда выполнение кода завершается приложение выполняет некорректное обращение по адресу памяти и выгружется.

Где бы Вы стали копать?


 
Тимохов   (2003-12-19 15:36) [1]

1. В хелпе
2. Код приведи.


 
Семен Сорокин   (2003-12-19 15:37) [2]

в коде программы


 
Ил_204   (2003-12-19 15:39) [3]

В хелпе... Есть ли ньюансы использования FreeOnTerminate?


 
Семен Сорокин   (2003-12-19 15:41) [4]

Есть ли ньюансы использования FreeOnTerminate
только то, что самому не надо удалять его.


 
Digitman   (2003-12-19 15:42) [5]


> Есть ли ньюансы использования FreeOnTerminate?


нет
это св-во просто взводит флаг, предписывающий VCL-объекту, управляющему код.потоком, разрушить свой собственный экз-р по завершению поточной ф-ции


 
Тимохов   (2003-12-19 15:51) [6]

Еще есть особенность, что когда стоит этот флаг, то в коде вызываеющего потока может случиться такое, что до выполнения следующей строки поток может выполниться.
Собственно это в хелпе есть

Warning: When FreeOnTerminate is True, the Execute method may run and then free the thread before your application can execute the next line of code. Thus, you should not call any methods of the thread object when FreeOnTerminate is True unless you create the thread in a suspended state.


 
panov   (2003-12-19 16:43) [7]

>Тимохов © (19.12.03 15:51) [6]

Не в коде вызывающего потока, а в конструкторе этого потока.

Смысл такой:
Например, в классе потока определен массив FCounter:
type
TMyThread=class(TThread)
...
FCounter: array[1..10000] of Integer;
...

constructor TMyThread.Create;
var
i: Integer;
begin
inherited Create(False);
// вот здесь уже вызывается на выполнение процедура потока Execute


//Соответственно, цикл в следующей строке вызовет AV, если Execute закончит выполнение раньше, чем закончится инициализация массива.

FreeOnTerminate := True;
for i := 1 to 10000 do Self.FCounter := i*10;
end;


 
Тимохов   (2003-12-19 16:47) [8]

2panov ©
Конечно вы правы.
Я не прав - виноват. Видно сказывается скудный опыт в применении потоков.


 
Тимохов   (2003-12-19 16:57) [9]

2panov ©
Хотя знаете ли, наверное я погорячился признать свою неправоту.
Мое высказываение в Тимохов © (19.12.03 15:51) [6] также применимо к следующему коду
type
tmythread = class (tthread)
procedure execure; override;
end;

procedure tmythread.execute();
begin
end;

var
t: tmythread;
bagin
t := tmythread(false);
t.freeonterminate := true;
t.resume;
// или любое поле из t
if t.terminated then ...

будет ав.
Если бы не было t.freeonterminate := true, то ав не было бы.
Разве я не прав?


 
panov   (2003-12-19 16:57) [10]

>Тимохов © (19.12.03 16:47) [8]

Вот блин... ничего не виноват...
Всё с опытом приходит-)


 
Тимохов   (2003-12-19 17:00) [11]

panov © (19.12.03 16:57) [10]
Так все-таки в [9] я прав или нет?


 
Digitman   (2003-12-19 17:05) [12]


> t := tmythread(false);


вот это вот - чертовщина какая-то)


 
Тимохов   (2003-12-19 17:06) [13]

Digitman © (19.12.03 17:05) [12]
t := tmythread.create(false);


 
Digitman   (2003-12-19 17:12) [14]


> Если бы не было t.freeonterminate := true, то ав не было
> бы.


это зависит от конкретной реализации метода Execute



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

Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
7-12186
MaG
2003-10-25 13:57
2004.01.05
Клавиатура


4-12197
maker
2003-11-04 20:16
2004.01.05
Как перерисовать окно на WinAPI?


1-11916
Крутыш
2003-12-21 13:24
2004.01.05
Как отменить нажатие определённой клавиши в DbGrid?


11-11843
SerB
2003-04-14 07:30
2004.01.05
SizeGrip???


8-12008
xn0bys
2003-08-29 08:23
2004.01.05
Как создать на клиентской части формы БИТМАП (НЕ канву).





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский