Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC зависает при разрыве соединения. / 25 сообщений из 32, страница 1 из 2
03.08.2017, 11:02
    #39499543
FireDAC зависает при разрыве соединения.
Добрый день, коллеги.

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

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

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

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

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

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

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


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



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




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

Код: pascal
1.
FEventAlerter.Register
...
Рейтинг: 0 / 0
08.10.2018, 21:51
    #39714686
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Попробуй заменить тело метода на:
Код: 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
08.10.2018, 22:25
    #39714698
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Dmitry, скажите, вы сейчас поддерживаете FireDAC или "Изя все"? Или в Дебаркадере кто-то его пилит вместо вас?
...
Рейтинг: 0 / 0
09.10.2018, 10:02
    #39714777
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
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
09.10.2018, 10:52
    #39714796
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
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
09.10.2018, 11:25
    #39714813
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
я совсем не в теме, просто проходил мимо :) и заметил, что как то странно используется имя класса. Удивлен, что это вообще скомпилировалось

Код: pascal
1.
while (FWaitThread.ThreadID <> TThread.Current.ThreadID) and
...
Рейтинг: 0 / 0
09.10.2018, 11:31
    #39714818
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
P.S.
если Current(), конечно, не классовая функция ....
...
Рейтинг: 0 / 0
09.10.2018, 11:38
    #39714823
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
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
09.10.2018, 12:05
    #39714844
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Код: 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
09.10.2018, 12:22
    #39714854
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Игорь_UUS
(FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil)
Условия нвадо поменять местами ....
...
Рейтинг: 0 / 0
09.10.2018, 13:20
    #39714884
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Dmitry ArefievИгорь_UUS
(FWaitThread.ThreadID <> TThread.Current.ThreadID) and (FWaitThread <> nil)
Условия нвадо поменять местами ....

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

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

Код: 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
09.10.2018, 14:24
    #39714925
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Игорь_UUS
Из procedure TFDPhysMSSQLEventThread.Execute стал выходить... но вот ошибка памяти по каким то причинам осталась((, но вот только под дебагом. При этом ошибка не лезет наружу, если запуска не под дебагом

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

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

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

Код: 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
09.10.2018, 16:10
    #39715002
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Игорь_UUS,

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

а смысл?
он же с автором общался.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
09.10.2018, 16:22
    #39715010
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
Код: 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
09.10.2018, 16:24
    #39715011
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC зависает при разрыве соединения.
09.10.2018 16:22, Кроик Семён пишет:
> Kстати, нигде не смог найти в доке,

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

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

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

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


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