dialog mit progressbar nutzen



  • hi,
    ich habe eine dialogbasierte mfc-anwendung. in meinem hauptdialog wird nun an einer bestimmten stelle eine berechnung gestartet und waehrend dieser berechnung soll ein unterdialog (mit einer progressbar) angezeigt werden wobei man die berechnung durch einen "Abbrechen" Button im Unterdialog nocht abrechen koennen soll.

    mein problem ist dass ich den genauen ablauf des obig beschriebenen programmieren kann (muss ich Threads verwenden?).

    danke.

    PS:
    ich will NICHT dass die berechnung im OnInitDialog vom Unterdialog gestartet wird.



  • Servus,

    wenn du während der Berechnung, welche vielleicht längere Zeit dauernd könnte, andere Aktionen starten willst, dann solltest du aufjedenfall Threads benutzen. Bsp. dazu gibt es z.B. in der MSDN, Stichwort: AfxBeginThread() aber auch hier im Forum gibt es tausende Beiträge zum Thema "Thread".

    Mein Vorschlag wäre:

    1. Du bastelst dir einen Hauptdialog
    2. Du bastelst dir einen Nebendialog (Typ: CDialog)
    3. Du bastelst dir eine Threadklasse (Typ: CWinThread) in der du den Nebendialog aufrufst (Stichwort: Nicht-Modaler-Dialog) und natürlich auch die Berechnung durchführst.

    Möchtest du nun von deiner Threadklasse oder deiner 2ten Dialogklasse auf deinen Hauptdialog, bzw. deren Klasse zugreifen, dann musst du daran denken den Zeiger des Hauptdialoges an die anderen beiden mitzugeben.

    Hierbei könnte dir auch AfxGetMainWnd() weiterhelfen.

    Aber ich denke mal, damit wird dir fürs erste geholfen sein...

    *winke*
    Hellsgore



  • ich werde es ausprobieren danke.

    gruss 🙂



  • also ich habe da eine methode void rechnen() in meinem hauptdialog. in dieser soll nun eine hauptberechnung ausgefuehrt werden. ich wuerde nun gerne in dieser methode einen eigenen thread starten, der nix weiter tut als einen kleinen dialog mit einer progressbar anzuzeigen (der unterdialog hat einen "abbrechen"-button, mit dem die berechnung im hauptdialog abgebrochen werden koennen soll). also in etwa so (per Worker-Thread):

    MyHauptDlg::rechnen(){
    
        // PUNKT 1    
        CWinThread *pThread = AfxBeginThread(showReportProgress, NULL);
    
        // PUNKT 2
        // berechnungen ...
        // irgendeine komplexe und lagen berechnung hier
    }
    
    UINT MyHauptDlg::showReportProgress(LPVOID lParam){
    
        // Hier unterdialog modal anzeigen lassen und auf "abbrechen"-button-druck
        // reagieren ...
    }
    

    Meine Frage(n) ist folgende:

    1. wieso meckert mein compiler in der zeile bei CWinThread (siehe PUNKT1 oben) mit der meldung: "Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden"

    2. wie kann ich nun mit obigem ansatz weiter fortfahren und die Berechnung bei PUNKT2 (s.o.) abbrechen wenn auf den Abbrechen Button im Unterdialog beim Thread-aufruf geklickt wurde???

    Vielen Dank.

    Gruss


Anmelden zum Antworten