Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Помогите побороть ошибку! И как работает свойство FreeOnTerminate   Найти похожие ветки 

 
Gek1   (2005-02-10 13:34) [0]

Вопрос в таком:
Если я пишу FreeOnTerminate := True;
Как написано в описание - поток сам освободит свои ресурсы.

Получаеться что все что я бы ни создал - само освободиться и мне ненадо об этом заботиться или как?

А случилось у меня следующее. Встроил я языковый скрипт в доп поток. И когда я запускаю один скрипт - все в порядке. Когда я запускаю одновременно несколько скриптов (несколько потоков), то при завершении всех после первого - вылетает ошибка:
"Access violation at address ... "

Код:

constructor TScriptThread.Create(Sender : TObject; Script : TStringList);
begin
inherited Create(True); {Поток создаем в состоянии «Приостановлен»}
FreeOnTerminate := True; {Поток освободит ресурсы при окончании работы}
{Переменные}
Thread := Self;
Char := Sender;
Macros := TStringList.Create;
Macros.AddStrings(Script);
Self.Priority := tpLower; {Стартуем с чуть пониженым приоритетом}
Resume; {Переводим поток в состояние «Активен»}
end;

destructor TScriptThread.Destroy;
begin
PSScript.Free;
Macros.Free;
inherited Destroy;
end;

procedure TScriptThread.Execute;
begin
try
PSScript := TPSScript.Create(nil);
PSScript.OnCompile := Thread.PSScriptCompile;
PSScript.OnCompImport := Thread.IFPS3ClassesPlugin1CompImport;
PSScript.OnExecImport := Thread.IFPS3ClassesPlugin1ExecImport;
PSScript.OnExecute := Thread.PSScriptExecute;
PSScript.OnLine := Thread.OnLine;
{Перед запуском скрипта регистрируем поток}
Synchronize(Register_Script);
{Запуск самого скрипта}
ExecuteScript;
finally
{После отработки скрипта дерегистрируем поток}
Synchronize(UnRegister_Script);
end;
end;


Сам скрипт все что делает - ждет 3 сек и выходит!

Так вот когда прохожу пошагово отладчиком, то в первом потоке при вызове PSScript.Free я пошагово прохожусь по всем строкам процесса Free. а вот при завершении второго - когда прохожусь отладчиком - то на методе PSScript.Free вылетает ошибка и дальше на каждую попытку пойти дальше каждый раз открываеться окно CPU!

Если я закоментирую FreeOnTerminate := True, то ошибки нету!

Мастера обьясните - при FreeOnTerminate мне получаеться ненадо освобождать все вручную? Или есть какието нюансы?


 
Digitman ©   (2005-02-10 13:40) [1]


> "Access violation at address ... "


так и пишет многоточие ?


 
Gek1   (2005-02-10 13:48) [2]


> Digitman ©   (10.02.05 13:40) [1]

Exception EAccessViolation in module Project1.exe at 0000103A.
Access violation at address 0000203А. Read of address 0000203A.

Далее сам дебугер говорит:
Project Project1.exe raised exception class EOSError with message "System Error. Code: 5. Отказано в доступе".


 
Юрий Зотов ©   (2005-02-10 13:50) [3]

Где и как объявлена переменная PSScript?
А заодно и переменные Thread, Char и Macros?


 
Gek1   (2005-02-10 13:55) [4]


> Где и как объявлена переменная PSScript?
> А заодно и переменные Thread, Char и Macros?

В дополнительном потоке.
var
  Thread : TScriptThread;
  Macros : TStringList;
  Char : TObject;
  PSScript: TPSScript;


 
Digitman ©   (2005-02-10 13:59) [5]


> Gek1



> Где и как объявлена переменная .. ?


> В дополнительном потоке


переменную НЕЛЬЗЯ объявить в потоке, ни в основном ни дополнительном ..

переменную можно объявить в тексте программного модуля


 
Gek1   (2005-02-10 14:07) [6]


> Digitman ©   (10.02.05 13:59) [5]

Но в моем случае она обьявляеться! Сам поток описан в отдельном модуле! и в модуле потока и в модуле main есть директива Var, которая обьявляет переменные! Что происходит подробно с переменными, обьявленными в модуле потока?
Обьявит их всеравно программа?
Тогда получаеться что у меня несколько потоков работают не каждый со своими переменными а вместе с одними?


 
Anatoly Podgoretsky ©   (2005-02-10 14:17) [7]

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


 
Digitman ©   (2005-02-10 14:27) [8]


> Но в моем случае она обьявляеться!


но НЕ В ПОТОКЕ ! а в некоем ПРОГРАММНОМ МОДУЛЕ !


> получаеться что у меня несколько потоков работают не каждый
> со своими переменными а вместе с одними?


похоже что именно так и получается


> Что происходит подробно с переменными, обьявленными в модуле
> потока?


НИЧТО не мешает декларировать и реализовать в одном и том же ПРОГРАММНОМ МОДУЛЕ более чем один поточный класс

как тогда понимать теримин "модуль потока" ? КАКОГГО ПОТОКА, спрашивается ?


 
Gek1   (2005-02-10 14:35) [9]

Ясно. Спасибо.


 
Юрий Зотов ©   (2005-02-10 14:42) [10]

> Gek1   (10.02.05 14:07) [6]

> Тогда получаеться что у меня несколько потоков работают не
> каждый со своими переменными а вместе с одними?

Именно так. Я потому и спрашивал, что сразу это заподозрил. И после того, как один поток в своем деструкторе вызовет PSScript.Free или Macros.Free, тот же самый код для другого потока даст Access violation. Что и наблюдаем.

А кроме того, при таком коде возникает еще и утечка памяти.

Сделайте эти переменные не глобальными в модуле, а полями потока. Тогда каждый экземпляр потока будет работать со своими полями и не мешать другим.


 
Gek1   (2005-02-10 15:39) [11]


> Юрий Зотов ©   (10.02.05 14:42) [10]


Спасибо, я уже так и сделал!

Вопрос остался по поводу FreeOnTerminate. Насколько он мне нужен и зачем?


 
Digitman ©   (2005-02-10 15:51) [12]


> Насколько он мне нужен и зачем?


станд.справку к этому св-ву почитать  - не судьба ?


 
Юрий Зотов ©   (2005-02-10 15:52) [13]

> Gek1   (10.02.05 15:39) [11]

> FreeOnTerminate. Насколько он мне нужен и зачем?

Это уже Вам решать. Если нужно чтобы объект "поток" уничтожался автоматически после завершения Execute - оставьте, если будете уничтожать его вручную - уберите.


 
Petr V. Abramov ©   (2005-02-10 17:50) [14]

Еще не мешает проверить, нет ли глобальных переменных в интерперетаторе скрипта.


 
icWasya ©   (2005-02-10 19:29) [15]

А специально для переменных, обьявленых в МОДУЛЕ ПОТОКА, вместо Var нужно писать ThreadVar


 
Fay ©   (2005-02-10 19:47) [16]

2 icWasya ©   (10.02.05 19:29) [15]
>> в МОДУЛЕ ПОТОКА
Где это и чем это место так примечательно?



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

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.059 c
3-1106649804
MakedoneZ
2005-01-25 13:43
2005.02.27
Вопрос про DBGrid и Table.


14-1107368351
Луарвик
2005-02-02 21:19
2005.02.27
Вышел трейлер фильма BloodRayne


6-1103016904
Змей
2004-12-14 12:35
2005.02.27
Chat


14-1107350591
VID
2005-02-02 16:23
2005.02.27
Нужна русская дока по WinRoute 6.x.x


6-1103192994
Ivolg
2004-12-16 13:29
2005.02.27
Web Server