Programm wird nicht wirklich beendet.



  • Hi @all,

    wenn ich mein Programm schließe, ist es zwar augenscheinlich geschlossen (d.h. auf den Desktop nicht mehr sichtbar) aber im Taskmanager läuft der Prozess noch. Somit kann ich das Programm nicht noch mal öffnen, da es ja schon geöffnet ist. Gibt es da irgendwelche Fehler, die beim schließen von Programmen oft gemacht werden?
    Ich schließe mein Programm über

    CDialog::OnOK();
    

    Hin und wieder wird es auch komplett geschlossen, aber nicht immer. 😞



  • Ich habe rausbekommen, dass mit

    CDialog::OnOK();
    

    nur das Dialogfeld geschlossen wird und nicht das ganze Programm.
    Aber was ist eigentlich die richtige Methode um ein Programm zu beenden?

    CDialog::OnCancel();
    CDialog::OnCancelMode();
    CDialog::OnClose();
    CDialog::DestroyWindow();
    ...
    

    Was braucht man wann? 😕



  • Hi,

    mit dem ganzen Dialogkruscht 😉 kannst du nur den Dialog / die Dialoge manipulieren.
    Schau mal, dass InitInstance mit FALSE beendet wird (dann beendet sich das Programm anstatt die Nachrichtenverarbeitung zu starten).

    Grüße Rapha



  • Also, meine InitInstance() sieht so aus

    CHauptdlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
    	return FALSE;
    }
    else if (nResponse == IDCANCEL)
    {
    	return TRUE;
    }
    

    Meine Funktion OnExit() so

    BOOL temp = MsgSenden("Wollen Sie das Programm wirklich beenden?",TRUE);
    	if(temp == TRUE)
    		OnOK(); // OnOK() wird vermutlich falsch sein
    

    Die Funktion MsgSenden gibt bei OK TRUE zurück, bei Abbruch FALSE

    Wie bekomme ich es in meiner Funktion OnExit() hin, das in InitInstance() nResponse == IDOK ist?



  • Mach das lieber mit einer Schleife!



  • estartu_de schrieb:

    Mach das lieber mit einer Schleife!

    Wie meinst Du das?

    Ich will eigentlich nur, das nach Abfrage (durch meine selbst geschrieben MessageBox) das Programm beendet wird (wenn OK gedrückt wurde).



  • Dann mach das etwa so:

    while (IDCANCEL == dlg.DoModal())
    {
    // hmm, gibt nix zu tun, schade
    }
    return FALSE;
    

    Mit der if macht der den Dialog auf, du machst zu und NUR wenn du mit OK beendet hast, wird auch das Programm beendet. Sonst läuft es nämlich weiter, weil du TRUE zurückgegeben hast.

    Oki? 🙂

    PS: Denk an den Spruch, den hier einer in der Signatur stehen hat: "Computer machen nur das, was du ihnen sagst, nicht was sie machen sollen." Oder so ähnlich.



  • Dann stimmt also

    BOOL temp = MsgSenden("Wollen Sie das Programm wirklich beenden?",TRUE); 
    if(temp == TRUE) 
       OnOK();
    

    ?



  • Ich kenne MsgSenden leider nicht.

    Sollte der Rückgabewert TRUE bedeuten, dass der User Ja gedrückt hat, dann ist das okay.



  • Ja, gibt True zurück.

    Danke 🙂


Anmelden zum Antworten