Константин 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.

А про то что на альфе работало - вспоминается старый анекдот
"Если вам с первого раза удалось написать программу, в которой компилятор не обнаружил ни одной ошибки - сообщите об этом сисадмину, он исправит ошибки в компиляторе" ;-)

Reply via email to