keine aktualisierung während programmlauf



  • Hallo Leute,

    Ich habe mal eine frage weil ich nicht weiter komme. Mein Dialog Programm soll ein paar Dateien auslesen und das kann immer eine kleine Weile dauern aus diesem Grund brauche ich eine Statusanzeige aber das Problem ist wenn ich das programm starte dann ist das Fenster "busy" und kann erst dann wieder angesteuert / gesehen werden wenn die ganze sache schon vorbei vorüber ist.

    Kann mir jemand erklären wie ich das Fenster dazubringe sich sagen wir nach jedem schleifen durchlauf einmal neu zu "zeichnen"?

    Gruss,
    JGL



  • Nimm doch einen Thread. Das ist sauberer.



  • Ich habe leider noch nicht ganz so viel Erfahrung in C++ (schlanke 16) - ist ist das kompliziert? Wie müsste ich das anstellen, weil ist halt nur ein Singledialog Programm und ein Thread würde vielleicht den Rahmen sprengen.

    Gruss,
    JGL



  • Servus,

    Guck mal in der MSDN unter AfxBeginThread. Dort ist auch irgendwo ein schönes Bsp.

    Hier noch ein Bsp von mir:

    //in .h
    static UINT DeinThread(LPVOID pParam);
    
    //in.cpp
    UINT CDeinDlg::DeinThread(LPVOID pParam)
    {
       //CDeineAusführklasse muss vom Typ
       //CWinThread sein
       //mach was
       //Da static musste ((CDeinDlg*)pParam)-> verwenden
    }
    
    void CDeinDlg::ButtonClick()
    {
        AfxBeginThread(DeinThread, this)
    }
    

    Du erstellst dir eine Neue Klasse Bsp. "CReadDate" vom Typ CWinThread. In dieser Klasse erstellst du eine Funktion Bsp. "ReadData". In dieser Funktion liest du dann deine Dateien aus und gibst diese an deine Hauptklasse wieder zurück bzw. spuckst diese dann irgendwo aus. Kommt drauf an was du machen willst.

    Viel Spass
    *winke*
    Hellsgore

    EDIT:
    Du kannst auch noch während einem Lesevorgang bzw. während dein Prog in einer Schleife hängt alle Msg durchleiten.

    Bsp:

    void CDeinDlg::PumpMessages()
    {
        ASSERT(GetSafeHwnd() != NULL);
        MSG msg;
    
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (!IsDialogMessage(&msg))
            {
                ::TranslateMessage(&msg);
                ::DispatchMessage(&msg);
            }
        }
    }
    

    in deiner Schleife:

    while (blabla)
    {
      PumpMessages();
      LeseDaten();
    }
    


  • Besser ist PumpMessage aus dem Thread, denn dann wird überall auch PreTranslateMessage aufgerufen 😉

    bool CDeinDlg::PumpMessages()
    {
        ASSERT(GetSafeHwnd() != NULL);
        ASSERT(AfxGetThread() != NULL);
        MSG msg;
    
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(!AfxGetThread()->PumpMessage())
            {
                // WM_QUIT wurde empfangen - Beenden!
                // Vorher aber WM_QUIT erneut senden
                AfxPostQuitMessage(msg.wParam);
                return false;
            }
        }
    
        return true;
    }
    

Anmelden zum Antworten