Бред и ахинея, сорри, но это так
> constructor TExec.Create(Task : TExecTask; FileName : String = '');
> begin
> inherited Create(true); // насколько я понимаю создаю
> // приостановленную нить
Сначала инициализация, а потом inherited Create - запомни это
правило
для наследников TThread
> Self.FreeOnTerminate := True;
> Self.Priority := tpLower;
Не трогай приоритет потока, это не нужно. По крайней мере -
глобально
> try
> // этот блок пробовал выносить через syncronize ...
Какой syncronize если ты TExec в основном потоке создаёшь ???
> DM.sqllog.ActiveStatistics := False;
> DM.sqllog.ActiveLogging := False;
> if Dm.DB.Connected then DM.DB.Close; // !!! <- здесь отубаю
> // коннект основного потока
> // ... ло лампочки :(
> // Что самое интерестное, здесь выбивало всего 2 раза на
> // deatach_database - потом куда-то исчезло :(
Event'ы в основном коннекте есть ?
Методы датамодулей нонче не в почёте - нужно все его потроха из
левого
класса трогать ?
> // интерестно этот кусок созаёт подключение уже в нити ...
Интересно - ты всегда пишешь код, который не понимаешь ?
> 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;
> 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;
И кто этот последний raise будет ловить ?
> end;
> end;
> end;
>
> destructor TExec.Destroy;
> begin
> try
> if Assigned(SP) then FreeAndNil(SP);
> if Assigned(Trans) then FreeAndNil(Trans);
> if Assigned(DB) then FreeAndNil(DB);
>
> except
> on E: Exception do
> AppELog(StrОшибкаЗавершенияПр + STRTask[FTask] + ':' + E.Message, True,
> True);
> end;
> inherited Destroy;
> DM.sqllog.ActiveStatistics := True;
> DM.sqllog.ActiveLogging := True;
> // Интеестно этот кусок где выполяется ? ...
в потоке TExec
> try
> DM.DB.Open;
> except
> AppELog(StrНеМогуВлючитьБД, true, true)
> end;
> // в основном потоке ? или пытается в уже убитой нити ?
> end;