Thread fuer ein Bitte Warten dialog



  • Heiho

    ne kurze frage haette ich

    und zwar, wenn ich ein "Bitte Warten" dialog machen moechte, waer es doch das beste es in einen thread aus zu lagern

    ich hab bissl rumgesurvt und gelesen und hab einmal oberflaechenthread und workerthread gefunden

    ich wuerde das so machen wollen

    pseudocode:

    klick auf button
    in der funktion dann
    AfxBeginThread()
        CDialogDingsbums cd;
        cd.DoModal();
    AfxEndThread();
    

    nu bin ich der meinung - so einfach wird das nicht gehen, private versuchen brachten bisher nichts

    was haettet ihr fuer ein tipp fuer mich ?



  • ähm warum sollte das deiner meinung nach nicht so einfach gehn.

    ich würde sagen das geht so einfach

    was willst du den komplizierter machen ?? 😉

    New Edit:
    das einzigste was ich anderst machen würde ich würde den start des Thread

    AfxBeginThread auserhalb der funktion setzen in der du den 2ten dialog startest. und von der threadfunktion von der du in AfxBeginthread verweist auf die funktion verweisen die den dialog öffnet;

    verwirrt???
    beispiel:

    static DWORD m_dwThreadExitCode;
    
    void C...Dlg::OnButtonKlick()
    {
    
        AfxBeginThread(thrFunction, this);
    }
    
    UINT C..Dlg:: thrFunction(LPVOID pParam)
    {
        C..Dlg* pDlg = (C...Dlg*) pParam;
    
        ::GetExitCodeThread(pDlg, &m_dwThreadExitCode);
    
        OpenDlgFunktion(); 
    
    return 0;
    }
    
    void C...DLg::OpenDlgFunktion()
    {
        CNewDlg NewDlg;
        if(NewDlg.DoModal()==IDOK)
        {
    
        }
        AfxEndThread(m_dwThreadExitCode,TRUE);
    
    }
    


  • Naja, ich würde es genau umgekehrt machen: Dialog ganz normal darstellen, wie sonst auch. Aber die lange Aufgabe/Berechnung in einen Thread auslagern.



  • danke LowFly ich werds spaeter ausprobieren sobald ich zeit find - sieht sehr vielversprechend aus {=

    @Artchi - an sich schon richtig - nur mein ziel ist es das man das dialog anzeigen lassen kann aber das hauptfenster weiterhin normal zu bedienen ist (das bitte warten ist eigentlich nur ein beispiel)

    zuerst dacht ich - erstelle ich des dialog mit create und werd es dann irgendwann zerstoeren sobald es notwendig ist - nur ich bi noch im MFC lern prozess, und mitlerweile schon sehr weit gekommen das ich dacht - fang mit threads an, aber als ersten mit einfachen die ich in meinem projekt auch verbinden kann



  • ich habs zwar noch nie probiert aber,
    aber ich wage es zu bezweifeln das du mit DoModal selbst in einem Thread zugriff auf das Hauptfenster erhälst.

    wenn du nebenher das Hauptfenster bedienen willst ist wie du schon sagts Create die richtige wahl.



  • hab ich auch grad rausgefunden - hab den code zum laufen gebracht - ich wuerd das gern nu mit diesen "Bitte Warten" verbinden, ich hab eine dialogbox in den thread erstellt - nu frag ich mich aber gerade - wie zerstoere ich das fenster wieder - bzw woher weiss der thread das er beendet werden kann ?!

    void COwnDoc::OnFunktion()
    {
    	CShowLog ShowLogDlg;
    	ShowLogDlg.m_csFileName = m_cLog.m_csFileName;
    	ShowLogDlg.DoModal();
    	PleaseWait();	
    }
    static DWORD m_dwThreadExitCode;
    void COwnDoc::PleaseWait()
    {
    	::AfxBeginThread(thrFunction, this);
    }
    UINT COwnDoc::thrFunction(LPVOID pParam)
    {
    	COwnDoc* pDlg = (COwnDoc*)pParam;
    	::GetExitCodeThread(pDlg, &m_dwThreadExitCode);
    	OpenDlgFunktion(); 
    	return 0;
    }
    void COwnDoc::OpenDlgFunktion()
    {
    	CPleaseWait pleaseWait;
    	pleaseWait.DoModal();
    	::AfxEndThread(m_dwThreadExitCode,TRUE); 
    }
    


  • ich glaub ich hab grad was kapiert

    wenn das hauptprogramm im hintergrund arbeiten soll - aber ein "dialog" auf bitte warten hinweisen soll

    sollte das dialog mit create erstellt werden und dann sobald es fertig ist wieder zerstoert werden

    entweder das oder man lagert nicht das dialog in dem thread aus sondern diese aktion die das bitte warten ausloest in nem thread aber frag mich dann grad wann und wo ich dann das bitte warten aufruf

    aber ich glaub ich machs doch mit dem create - #gg



  • hmm ne andere möglichkeit wäre zB CreateDialog zu verwenden, das gibt dir nen HWND zurück, das könntest du verwenden um im thread zb in ner schleife oder gleich in der Callback funktion des CreateDialog das HWND abfragen ob es noch gültig ist. ist es noch gültig existiert der Dialog, ist es ungültig endet der thread.



  • ich hab das jetzt so gemacht

    eine funktion "PleaseWait();" und eine "EndWait();" in der please erstell ich es per create und in der end zerstoer ich das dann wieder, das brauch ich dann "nur" noch an den richtigen positionen setzen -

    koennte nun ein fortschrittsbalken darin versehen in nem eigenen thread - das so hin und her pendelt oder so, einfach damit man sieht das noch was passiert {=

    vielen dank - wieder was gelernt {=


Anmelden zum Antworten