KB> Hi Константин !

KB>  К> замечательный метод Syncronize - он не помогает

KB> А ты не забыл, что всё, что ты затолкаешь в этот замечательный
KB> метод, работает в главном потоке приложения ? А если я всё
KB> правильно понял, то коннект ты создаешь в дополнительном потоке.

    Ну да, ... стоп !
    т.е. я не могу использовать коннект созданный в нити
    при выполнении части кода внутри Syncronize ?

    Мля - совсем запутался:

  TExec = class(TThread)
    DB     : TpFIBDataBase;
    Trans  : TpFIBTransaction;
    SP     : TpFIBQuery;
    ...
    constructor Create(Task : TExecTask; FileName : String = ''); overload;
    procedure   Execute; override;
    destructor  Destroy; override;
    ...
  end;

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

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;
// Интеестно этот кусок где выполяется ? ...
  try
    DM.DB.Open;
  except
    AppELog(StrНеМогуВлючитьБД, true, true)
  end;
// в основном потоке ? или пытается в уже убитой нити ?
end;

PS: люди, ну ещё подкинте пару идей - замучался уже :(

С уважением,
Константин Григорьевич.
===============


Ответить