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

Вниз

Помогите побороть ошибку! И как работает свойство 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.144 c
4-1105647335
volser
2005-01-13 23:15
2005.02.27
Список процессов, которые инет юзают


3-1106819321
DSKalugin
2005-01-27 12:48
2005.02.27
Принцыпы трехзвенной архитектуры


1-1107985024
Homa_Programer
2005-02-10 00:37
2005.02.27
Разделитель дробной части


3-1106566495
Belkova
2005-01-24 14:34
2005.02.27
Копирование из одной БД в другую


6-1103616506
frEE)stylEr
2004-12-21 11:08
2005.02.27
ПРОБЛЕМЫ с IdTCPClient !!!





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