Dlaczego TADEventAlerter zawiesza aplikację przy zamykaniu programu?

Dlaczego TADEventAlerter zawiesza aplikację przy zamykaniu programu?
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 godzin
  • Postów:1599
0

Witajcie,

Postanowiłem pobawić się nieco notyfikacjami z bazy i przyznam szczerze, że działają wzorcowo .. do czasu. Może to wina moja, że nie umiem poprawnie tego używać ale liczę, że mi pomożecie. Przykładowy kod:

Kopiuj
type
    TMyClass= class(TForm)
      ...
    strict private
        FAD: TADEventAlerter;
        procedure aeAlert(ASender: TADCustomEventAlerter; const AEventName: string;
            const AArgument: Variant);
    public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy(); override;
    end;

procedure TMyClass.aeAlert(ASender: TADCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
begin
    inherited;
    if AEventName = 'addthb_event' then
    begin
        qTHB.Close;
        qTHB.Open();
    end;
end;

constructor TMyClass.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    FAD := TADEventAlerter.Create(Self);
    FAD.connection := TKBSDDBDM.Instance.db;
    FAD.OnAlert := aeAlert;
    FAD.Names.add('addthb_event');
    FAD.Active := True;
end;

destructor TMyClass.Destroy;
begin
    FAD.Free();
    inherited;
end;

poprawnie reaguje na zdarzenia. Niestety w przypadku drugiej i kolejnej formatki (każda ma swój FAD) przy zamykaniu całej aplikacji dzieją się "cuda". Czasami zamyka się poprawnie, czasami leci wyjątek z którejś (nie zawsze tej samej klasy) od firedac ale przeważnie wisi na zamknięciu wątków i finalnie się nie zamyka. Dlaczego napisałem druga i kolejna formatka? Bo w tej chwili mam okolo 8 różnych modułów opartych o eventy z bazy i wyjątki latają z wielu różnych formatek. Wystarczyło, że wyłączyłem

Kopiuj
    FAD.Active := False;

powiadomienia i problem się rozwiązał zatem zdecydowanie problem leży po stronie tegoż komponentu. Możecie coś podpowiedzieć?

PW
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:130
1

Z tego co pamiętam trzeba wyrejestrować ...EventAlerter.Unregister;

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 godzin
  • Postów:1599
0

@PrzemysławWiśniewski:
Niestety to nie to. Robiąc Free obiektu finalnie w którejś z klas firedac opala się Unregister samo. Nie mniej jednak dodałem ręczny unregister przed free i dalej to samo. Udało mi się nawet wyłapać taki komunikat:

screenshot-20211015100219.png

dlatego twierdzę, że problemem jest wiele komponentów tej klasy w obrębie jednej aplikacji. Zrobię test i spróbuję przygotować klasę z jednym komponentem na wielu eventach i dam znać czy problem się rozwiązał.

edytowany 1x, ostatnio: flowCRANE
PW
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:130
2

Ja w aplikacji posiadam tylko jeden komponent klasy TEventAlerter więc duże prawdopodobieństwo że jak masz ich więcej jest jakaś "kolizja" w ich obsłudze.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 godzin
  • Postów:1599
0

@PrzemysławWiśniewski: Testowo powyłączałem wszystkie zostawiając tylko 1 i jest jakby lepiej :P Dam znać gdyby przerobienie nie pomogło ;)

I zonk dalej mam zwis przy zamknięciu i coś takiego:

screenshot-20211015135127.png

edytowany 1x, ostatnio: flowCRANE
PW
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:130
0

Jaka wersja Delphi ? Załącz jakiś prosty projekt gdzie idzie to zasymulować to sprawdzę u siebie.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 13 godzin
  • Postów:1599
0

Dałem 1 komponent na całą aplikację, dodałem unregistered przed free i chyba problem się rozwiązał także dzięki @PrzemysławWiśniewski

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.