Константин wrote:
constructor TExec.Create(Task : TExecTask; FileName : String = '');
begin
inherited Create(true); // насколько я понимаю создаю
// приостановленную нить
Self.FreeOnTerminate := True;
Self.Priority := tpLower;
try
// этот блок пробовал выносить через syncronize ...
DM.sqllog.ActiveStatistics := False;
DM.sqllog.ActiveLogging := False;
Я сам DM тоже перенес в тред чтоб гарантировать, что его никто больше
снаружи не трогает, в ТОМ ЧИСЛЕ VCL компоненты типа гридов всяких. И
рекомендуется датасеты отключать от датасорсов, т.к. VCL может сунуться
за данными в любой момент.
if Dm.DB.Connected then DM.DB.Close; // !!! <- здесь отубаю
// коннект основного потока
// ... ло лампочки :(
// Что самое интерестное, здесь выбивало всего 2 раза на
// deatach_database - потом куда-то исчезло :(
Это тут нафиг не надо, и скорее вредно.
// интерестно этот кусок созаёт подключение уже в нити ...
DB := TpFIBDataBase.Create(nil);
Trans := TpFIBTransaction.Create(nil);
SP := TpFIBQuery.Create(nil);
...
// ... или его надо перенести в метод Execute ?
без разницы
// Дальше все обращения идут только к DB - этой нити
DB.Open; // и вот здесь всё и начинается :(
// ошибка плавающая в лучьшем случае здесь валится на
// attach_database ... а иногда и уже в методе execute
// на любом запросе ...
except
on E: Exception do
begin
bErr := True;
AppELog('Процесс' + STRTask[FTask] + 'Не эапущен, ошибка: ' + E.Message,
True);
Resume;
Resume в блоке обработки ошибок??????? Бред!!
Или ты чего-то пересокращал...
end;
end;
end;
procedure TExec.Execute;
begin
if bErr then Exit;
try
... /// тут чегоёто выполняем ;)
except
on E: Exception do
begin
bErr := True;
FText := E.Message;
Synchronize(Err);
raise;
end;
end;
end;
Raise тут совершенно не в тему, как и в остальных местах - выкинь нафиг.
Он дергает основной поток, что запрещено вне Synchronize.
А про то что на альфе работало - вспоминается старый анекдот
"Если вам с первого раза удалось написать программу, в которой
компилятор не обнаружил ни одной ошибки - сообщите об этом сисадмину, он
исправит ошибки в компиляторе" ;-)