Die Anwendung vom Taskmanager "Abgeschossen"



  • Hi,

    wie/wo kann ich mitkriegen, wenn die Anwendung vom Taskmanager "Abgeschossen" wird?
    FormCloseQuery(TObject *Sender, bool &CanClose)??? CanClose???
    Wo sehe ich ob die Anwendung geschloßen oder vom Taskmanager "Abgeschossen" ist?

    Alexander 😕



  • Grundsätzlich gar nicht. Der Taskmanager macht zunächst das Selbe wie der User und signalisiert deiner Anwendung, dass er sie gerne schliessen möchte (CloseQuery) Antwortest du darauf nicht, entfernt er deine Anwendung sauber aus dem Speicher.

    Und eines gleich vorweg: Der Taskmanager steht über allem und es gibt keine Möglichkeit zu verhindern, dass dich der Taskmanager aus dem Speicher wirft.

    -junix



  • Wo wir gerade beim Taskmanager sind:
    Wie kann ich unterdrücken, dass mein Programm in dessen "Anwendungen"-Liste auftaucht?

    Ich möchte verhindern, das meine Freundin mein "Erinnerungs"-Programm (siehe eben eröffnetes Thema in diesem Forum) wieder abschaltet.



  • Ich möchte in meine Anwendung noch "Status" in DB eintragen, bevor der
    Taskmanager mich aus dem Speicher wirft.

    Ich setze CanClose = false; aber Taskmanager trotzdem wirft mich aus dem Speicher.

    Kann ich in FormCloseQuery oder FormClose noch was machen bevor der
    Taskmanager mich aus dem Speicher wirft?
    (z. B. "DB-Status" eintragen)

    😕



  • Original erstellt von Sensei:
    **Wo wir gerade beim Taskmanager sind:
    Wie kann ich unterdrücken, dass mein Programm in dessen "Anwendungen"-Liste auftaucht?

    Ich möchte verhindern, das meine Freundin mein "Erinnerungs"-Programm (siehe eben eröffnetes Thema in diesem Forum) wieder abschaltet.**

    Dienst



  • Original erstellt von Sensei:
    Wo wir gerade beim Taskmanager sind

    Wir sind beim Beenden einer Anwendung mit dem Taskmanager also ein ganz anderes Thema.

    Ich möchte in meine Anwendung noch "Status" in DB eintragen, bevor der
    Taskmanager mich aus dem Speicher wirft.

    Ja OnCloseQuery() kannst du deinen aktuellen Status ohne Problem eintragen aber CanClose musst du anschliessend auf true setzen

    oder willst du detektieren ob du das Programm sauber beendet hast? Dann kannst du ja beim Beenden den Status auf "Sauber beendet" setzen und beim Starten auf "Gestartet", steht dann beim nächsten Start noch "Gestartet" wurde das programm nicht sauber beendet.

    -junix



  • Ja OnCloseQuery() kannst du deinen aktuellen Status ohne Problem eintragen >aber CanClose musst du anschliessend auf true setzen

    Wenn ich CanClose auf false setze, wirft mich der Taskmanager auch aus dem Speicher. Für Taskmanager scheint kein unterschied zu sein ob CanClose true oder false hat.

    Wenn die Anwendung aus irgend welchem Grund abgebrochen wird, kann ich trotzdem im FormCloseQuery oder FormClose noch was machen?

    Kann ich sicher sein, dass bevor Form geschlossen wird (egal aus welchem Grund) lande ich in FormCloseQuery oder FormClose, oder sollte ich AppMessage abfragen?

    Alexander. 😕



  • Auch der Taskmanager versucht zunächst den regulären Weg zu gehen und sendet die Schliessen Message an die betroffene Applikation.

    Logisch schmeisst er dich raus, wenn du CanClose auf false setzt. Lass CanClose doch eifnach CanClose sein und mach was du unbedingt noch vor dem schliessen machen wolltest?

    -junix



  • so weit,so gut, aber ...

    Ja OnCloseQuery() kannst du deinen aktuellen Status ohne Problem eintragen
    Wenn die Anwendung einfach gestartet ist, dann ist alles OK.

    Wenn meine Anwendung startet Prozess (SELECT/INSERT/UPDATE auf DB) und Prozess hat Laufzeit z.B. 30 Minuten und in gleiche Zeit wird die Anwendung vom Taskmanager "Abgeschossen", dann funktioniert mit OnCloseQuery() nicht.

    Wie kann ich "Status" eintragen wenn die Anwendung aktiv ist ? AppMessage ?

    Alexander 😕



  • Original erstellt von <Alexander>:
    [...]dann funktioniert mit OnCloseQuery() nicht.

    Was heisst funktioniert nicht? Wieso nicht? Verarbeitest du eine Schleife in deinem programm ohne die MessageQueue zwischenzeitlich zu leeren (Application->ProcessMessages())? Welcher Prozess übernimmt die 30min. Arbeit? Ein Thread?

    -junix



  • Welcher Prozess übernimmt die 30min. Arbeit? Ein Thread?
    in OnCloseQuery() setze ich den STATUS.

    Ich mache ein SELEC * from ... und das dauert 20 Min., dann noch 10 Minuten Insert(mit Schleife). Wenn die Anwendung inzwischen vom Taskmanager "Abgeschossen" wird, dann wird "STATUS" nicht gesetzt.

    Wenn SELECT/INSERT läuft, dann sehe ich im Taskmanager "Keine Ruckmeldung", obwohl nach dem SELECT/INSERT (30Min) ist die Anwendung sauber durch. Vielleicht wenn die Anwendung im Taskmanager mit "Keine Ruckmeldung" steht, und dann wird
    "Abgeschossen", dann gibt es keine OnCloseQuery()?

    Wenn die Anwendung gestartet ist und ist Passiv(läuft kein SELECT/INSERT), und wird vom Taskmanager "Abgeschossen", dann "STATUS" wird gesetzt.

    Alexander 😕



  • Original erstellt von <Alexander>:
    Vielleicht wenn die Anwendung im Taskmanager mit "Keine Ruckmeldung" steht, und dann wird "Abgeschossen", dann gibt es keine OnCloseQuery()?

    Ich sagte doch, CloseQuery ist eine Windows-message! "Keine Rückmeldung" erscheint dann, wenn die Nachrichten in der Message-Queue nichtemhr verarbeitet werden.

    Normalerweise nimmt man für Aufgaben die mal wieder länger dauern einen extra Thread (Hilfe->TThread). Wobei mir 20min für EINE Select-Abfrage irgendwie spanisch vorkommt... Das müssten ja ungeheure Datenmengen sein, die die Select-Abfrage da zu bewältigen hat?

    In Schleifen die innerhalb normaler Form-Events stehen solltest du immer Application->ProcessMessages() aufrufen um die Message-Queue zu verarbeiten.

    -junix


Anmelden zum Antworten