powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC зависает при разрыве соединения.
25 сообщений из 32, страница 1 из 2
FireDAC зависает при разрыве соединения.
    #39499543
Добрый день, коллеги.

Помогите плиз решить задачку, уже голову сломал.

Приложение работает с БД на MS SQL Server.

Использую два коннекта. Первый для работы с данными. Второй для подписки к ServiceBroker через FDEventAlert.
Все бы ничего, и в штатном режиме все работает и закрывается корректно.
НО при разрыве соединения (тупо выдергиваю сетевой шнурок) при попытке закрыть приложение Второй коннект зависает и не дает завершиться приложению. Помогает только снятие задачи через диспетчер.

Дата модуль с элементами FireDAC создается динамически.
При закрытие главной формы пытаюсь сделать Datamodule.Destroy - зависает.
Пытаюсь руками закрыть коннект Connect2.Connected := false - зависает.
Так же FDEventAlert.Unregister - зависает.

Что еще можно попробовать, что бы корректно завершить приложение при разрыве соединения?
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39499974
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте.
Код: sql
1.
FDConnection.AbortJob();
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39499978
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение что зависает вот тут:
Пройдите отладчиком, посмотрите
Код: pascal
1.
2.
3.
4.
5.
FireDAC.Stan.Util
procedure TFDThread.Execute;
....
case FMessageEvent.WaitFor(FIdleTimeout) of
...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FireDAC зависает при разрыве соединения.
    #39714442
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Проблема точь в точь!

Долго не мог понять в чём проблема, и она проявилась после того как сделал перевод проекта в XE6 на DX10.2.


X-CiteПопробуйте.
Код: sql
1.
FDConnection.AbortJob();



Это не помогает(((
Помогите, что ещё можно попробовать?
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714579
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,
Код: pascal
1.
2.
AutoConnect:= False;
AutoReconnect:= False;
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714593
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cptngrbИгорь_UUS,
Код: pascal
1.
2.
AutoConnect:= False;
AutoReconnect:= False;




теперь пишет ошибку "Must by active" на

Код: pascal
1.
FEventAlerter.Register
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714686
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй заменить тело метода на:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  if FWaitThread <> nil then begin
    FWaitThread.Terminate;
    FWaitCommand.AbortJob(True);
    while (FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil) do
      Sleep(1);
  end;
end;
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714698
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry, скажите, вы сейчас поддерживаете FireDAC или "Изя все"? Или в Дебаркадере кто-то его пилит вместо вас?
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714777
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievПопробуй заменить тело метода на:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  if FWaitThread <> nil then begin
    FWaitThread.Terminate;
    FWaitCommand.AbortJob(True);
    while (FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil) do
      Sleep(1);
  end;
end;



Dmitry ВЫ БОГ!!!! Огромное спасибо!!!

Помогло, единственное не разобрался как перекомпилить исходники пакета ((. Файл данного юнита скопировал в папку с проектом, внёс корректировки... получается при компиляции, среда его подхватывает (а не тот, который лежит в директории delphi) и работа идёт уже с ним
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714796
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

Только обрадовался, но не тут то было.

Если в процессе работы произошло разъединение с БД, программа не залипает, и восстанавливает соединение корректно.
Но, когда начинаешь закрывать приложение появляется "access violation at address..."

Пробовал "и так и эдак", и уничтожал объект "EventAlerter" и создавал заново после разрыва... всё равно ошибка памяти лезет. Видимо поток созданный в EventAlerter "висит"(( и выход в "InternalAbortJob"

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  if FWaitThread <> nil then begin
    FWaitThread.Terminate;
    FWaitCommand.AbortJob(True);
    while (FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil) do
      Sleep(1);
  end;
end;



всё же не корректен.

Что можно ещё попробовать?
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714813
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я совсем не в теме, просто проходил мимо :) и заметил, что как то странно используется имя класса. Удивлен, что это вообще скомпилировалось

Код: pascal
1.
while (FWaitThread.ThreadID <> TThread.Current.ThreadID) and
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714818
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
если Current(), конечно, не классовая функция ....
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714823
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.P.S.

Aaaa
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TThread.Current

Код: pascal
1.
class property Current: TThread read GetCurrentThread;



ОК, не обращайте внимание на все мои 3 поста
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714844
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TFDPhysMSSQLEventThread.Execute;
begin
  FAlerter.RegisterNotifications();
  while not Terminated and FAlerter.IsRunning do
    try
      if FAlerter.FMessageTab.Columns.Count = 0 then
        FAlerter.FWaitCommand.Define(FAlerter.FMessageTab);
      FAlerter.FWaitCommand.Open();                 <-- Заходит и вечно висит, если возникла ошибка (я так полагаю любая)
      if not Terminated then begin
        FAlerter.FWaitCommand.Fetch(FAlerter.FMessageTab, True);
        if (FAlerter.FMessageTab.Rows.Count > 0) and
           FAlerter.ProcessNotifications() then
          FAlerter.RegisterNotifications();
      end;
    except
      on E: EFDDBEngineException do begin
        Terminate;
        if not (E.Kind in [ekCmdAborted, ekServerGone]) then
          FAlerter.AbortJob;
      end;
    end;
end;



Если указать в свойстве TFDEventAlerter.Options.Timeout что-то более "0", то FAlerter.FWaitCommand.Open() будет жить именно это время в милисекундах. Но если возникает ошибка разъединения, данный метод залипает и следовательно поток остаётся жив!
Ошибка видна только под дебагом, следовательно она находится "где-то" под try except end, и далее что-то идёт не так как штатно.

Из за того, что поток остаётся жив, я предполагаю именно из-за этого возникает ошибка памяти по завершению приложения((
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714854
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS
(FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil)
Условия нвадо поменять местами ....
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714884
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievИгорь_UUS
(FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil)
Условия нвадо поменять местами ....

Поменял, помогло на 50%

Из procedure TFDPhysMSSQLEventThread.Execute стал выходить... но вот ошибка памяти по каким то причинам осталась((, но вот только под дебагом. При этом ошибка не лезет наружу, если запуска не под дебагом
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714891
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По коду получилось вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
{-------------------------------------------------------------------------------}
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  if FWaitThread <> nil then begin
    FWaitThread.Terminate;
    FWaitCommand.AbortJob(True);
    while (FWaitThread <> nil) and (FWaitThread.ThreadID <> TThread.Current.ThreadID) do
      Sleep(1);
  end;
end;



я полагаю как надо...
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714925
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS
Из procedure TFDPhysMSSQLEventThread.Execute стал выходить... но вот ошибка памяти по каким то причинам осталась((, но вот только под дебагом. При этом ошибка не лезет наружу, если запуска не под дебагом

Настройка компилятора "Complete boolean evaluation" должна быть False и в Debug и в Release
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714931
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-CiteИгорь_UUSИз procedure TFDPhysMSSQLEventThread.Execute стал выходить... но вот ошибка памяти по каким то причинам осталась((, но вот только под дебагом. При этом ошибка не лезет наружу, если запуска не под дебагом

Настройка компилятора "Complete boolean evaluation" должна быть False и в Debug и в Release

И там и там всегда в False
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39714941
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После двухдневных "танцев с бубном" это хоть как то стало работать(((. Под "хоть как то" явно на настылях, что-то внутри работает не правильно.

Код: sql
1.
while (FWaitThread <> nil) and (FWaitThread.ThreadID <> TThread.Current.ThreadID) do



Данная "подпилка" действительно помогает избежать залипания программы при разрыве связи, но под демагогом лезут ошибки памяти при завершении работы программы, или если в процессе работы вызвать:

Код: pascal
1.
FEventAlerter.Unregister;



Если же оставить по старому:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TFDPhysMSSQLEventAlerter.InternalAbortJob;
begin
  if FWaitThread <> nil then begin
    FWaitThread.Terminate;
    FWaitCommand.AbortJob(True);
    while FWaitThread <> nil do
      Sleep(1);
  end;
end;



работает стабильно (имеется ввиду без ошибок памяти) хоть под дебагом хоть просто запускай, НО программа обязательно залипнет как только произойдёт сбой связи с базой данных.

В компоненте "TFDEventAlerter" 100% есть баг, и его похоже не было в Delphi XE6. Могу судить по тому, как только перешли на Delphi DX10.2, и установив эту сборку клиентам, периодический поступают жалобы о залипании программы ИМЕННО после потери связи с сервером.

Остаётся надеяться, что данный "костыль" не будет усугублять проблему в собранном проекте...
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39715002
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

Так оформите в QC
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39715006
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2018 16:10, X-Cite пишет:
> Так оформите в QC

а смысл?
он же с автором общался.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39715010
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
                 ## 1 ##                           ## 2 ##
while (FWaitThread <> nil) and (FWaitThread.ThreadID <> TThread.Current.ThreadID) do



Kстати, нигде не смог найти в доке, но опытным путем заметил (Delphi 6), что второе условие не будет даже проверятся, если первое FALSE.
И всвязи с этим не знаю, всегда ли такое поведение. Есть ли 100%-ая гарания этой последовательности выполнения.
Ведь если нет, то возможен вызов FWaitThread.ThreadID даже если FWaitThread=nil .
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39715011
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
09.10.2018 16:22, Кроик Семён пишет:
> Kстати, нигде не смог найти в доке,

да ты уху ел.
F1: Complete versus short-circuit Boolean evaluation

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC зависает при разрыве соединения.
    #39715021
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийComplete versus short-circuit Boolean evaluation

в доке этого нет (D6 german)

но зато другое нашлось: если это включено {$B+}, то тогда только держись
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC зависает при разрыве соединения.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]