Константин wrote:
     Насколько я знаю FibPlus - при закррытии БД, закрываются и
     все DataSet'ы ... так что насчёт гридов я не беспокоюсь ...
Я не знаю твой код, но если в треде вы открываешь датасет, а на основной форме к нему привязан грид - то грид может его дернуть в любой момент.
Отошлю к старой борландовой статье
http://www.vspu.ru/is/files/doc/delphi-ti/16231.html
(почему то на борландовом сайте она не сохранилась)
Там про BDE, но принцип тот же: смотри как работа с VCL организована.

     А вообще-то я не понял как ты DM (TDataModule) перенёс в
     тред ?
Я о том, что в треде сделал бы _private_ переменную DM, в треде бы ее создавал и уничтожал, это бы гарантировало отсутствие внешних обращений. Хотя от задачи, конечно зависит.

KRB> Это тут нафиг не надо, и скорее вредно.

     Что именно ?
"if Dm.DB.Connected then DM.DB.Close;"
если ты создал второй коннект, то какая тебе разница, что происходит с основным? У меня вообще до 50 коннектов создается, половина к одной базе А выбивание может быть как раз с работой VCL связано (закрытие датасетов и перерисовка датаконтролов). Подозреваю, что у тебя все на одни датасеты завязано.

KRB> Resume в блоке обработки ошибок??????? Бред!!
KRB> Или ты чего-то пересокращал...

         Не там флаг bErr выставляется ...
Я бы понял если б было так:
try
...
  resume;
except
  SomeErrorProc()
  Free;
end;
Ведь при неудачном конструкторе объект уничтожается (кроме тех переменных что создал именно ты). А в деструкторе надо проверять все переменные на то, что они инициализированы и уничтожать при необходимости, то же самое с вызовом inherited в деструкторе - при необходимости. Если развернуть, то как-то так:
constructor ---
MyVar:=nil;
try
  MyVar:=TMyVar.Create();
  inherited;
  inheritedOK:=true;
  resume;
except
  SomeErrorProc()
  Free;
end;

destructor ---
  MyVar.Free; // Free проверяет на nil
  if inheritedOK then inherited;
end;
А Resume созданного с ошибкой треда - брррр...

KRB> Он дергает основной поток,
     Что ???? ЛЮБОЙ raise ???
Не любой, а необработанный в try-except. А насколько я вижу, у тебя обработчика нет, и raise передается в основной поток. Со всеми вытекающими.

Ответить