AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ersatz für Application.ProcessMessages

Ein Thema von dataspider · begonnen am 15. Feb 2008 · letzter Beitrag vom 16. Feb 2008
 
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.359 Beiträge
 
Delphi 11 Alexandria
 
#1

Ersatz für Application.ProcessMessages

  Alt 15. Feb 2008, 16:42
Hi,

ich bin gezwungen, in meiner Anwendung Application.ProcessMessages an einigen Stellen zu eliminieren,
da genau dieses für sporadische Abstürze der DevExpress QuantumGrid beim Destroy von Formularen sorgt.

Bisher hatte ich das Schließen der Anwendung so:

Alle Formulare schließen;
Application.ProcessMessages;
Disconnect von der DB;

oder Wechsel der Datenbank:

Alle Formulare schließen;
Application.ProcessMessages;
ReConnect von der DB;

Jetzt habe ich mir versuchsweise eine MethodenListe erstellt, welche ich z.B. bei Wechsel der DB füttere:
In MethodenListe Methode für Schließen aller Formulare;
In MethodenListe Methode für ReConnect;

Delphi-Quellcode:
procedure TFRMMain.DoChangeConnection(Sender: TObject);
Var
  AMethod: TNotifyEvent;
begin
  // Datenbank wechseln
  Application.ProcessMessages;
  if CanCloseEx then
  begin
    // Alles Fenster zu
    AMethod := CloseAllModules;
    FMethodList.Add(TMethod(AMethod));
    // neu verbinden
    AMethod := ChangeConnection;
    FMethodList.Add(TMethod(AMethod));
  end;
end;

procedure TFRMMain.UpdateActions;
begin
  inherited;
  if (FMethodList <> nil) then
    HandleNextMessage;
end;

procedure TFRMMain.HandleNextMessage;
Var
  AEvent: TNotifyEvent;
begin
  // immer ein Event nach FIFO abarbeiten
  if (FMethodList.Count <> 0) then
  begin
    AEvent := TNotifyEvent(FMethodList[0]);
    FMethodList.Remove(TMethod(AEvent));
    TNotifyEvent(AEvent)(Self);
  end;
end;
In der überschriebenen Methode UpdateActions der Form (welche ja vom Idle der App abhängig ist) rufe ich nun eine Methode auf, welche immer die erste Methode aus der Methodenliste holt, den Eintrag aus der Liste entfernt und die Methode ausführt.

Der Wechsel der BD funktioniert erst mal so weit. Aber das Schließen wird schon komplizierter, da ich das im CloseQuery des Forms abfange und es wahrscheinlich gar nicht mehr zum Aufruf von UpdateActions führt.

Gibt es eine elegantere Lösung?
Ideal wäre etwas in der Art:
Formular schließen;
Warten, bis es komplett zerstört ist;
Und jetzt weiter;

Aber das eben ohne Application.ProcessMessages...
Das Warten ist notwendig, da ich in den Formularen z.B. im BeforeDestruction noch alle möglichen Einstellungen in die DB schreibe.
Warte ich nicht, ist die DB-Verbindung gekappt, während die Forms noch fleißig versuchen, ihre Einstellungen in die DB zu schreiben.
Ich hoffe, mein Problem einigermaßen verständlich dargestellt zu haben.
Ich brauche jetzt nicht den Hinweis, mich bitte an den Herstelle zu wenden etc.
Ich brauche einen Workaround und möchte einfach nur wissen, ob und wie es evtll. besser geht.

Danke, Frank
Frank Reim
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz