Форум: "Основная";
Текущий архив: 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.052 c