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: люди, ну ещё подкинте пару идей - замучался уже :(
С уважением,
Константин Григорьевич.
===============