Бред и ахинея, сорри, но это так

> 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;

Ответить