Listenfeld: Verspätete Aktualisierung



  • Moin,

    ich habe mir ein Listenfeld erstellt.
    Das Listenfeld wird innerhalb einer Schleife mit Daten gefüttert.
    Das Problem ist, dass diese Daten erst nach dem Beenden der Schleife erscheinen und nicht direkt.
    Anhand des vertikalen Scrollbalkens weiß ich ,dass die Liste die Daten schon innerhalb der Schleife erhalten hat, da sich dieser vergrößert. Nur die Anzeige bleibt eben leider konstant.

    Hab schon:
    - Invalidate();
    - liste.ShowWindow;
    - liste.UpdateWindow;
    - liste.Invalidate;
    - liste.InvalidateRect;
    ausprobiert (Hab sie einfach ohne Hintergedanken durchprobiert).

    Hat jemand nen Rat parat??

    Danke im Voraus

    chackie-lee



  • Keiner eine Idee??

    Das Problem tritt sowohl bei CListBox als auch bei CListCtrl auf.
    Der "eigentliche" Inhalt dieser Liste wird stets aktuell gehalten, nur leider wird dies nicht direkt auf dem Bildschirm angezeigt.

    ip = jobListe.getItemIP(0);    // Liest IP aus nem Array
    m_Info.InsertString(0,"Job geladen: " + conIpToString2(ip) + ":" + conIntToString(jobListe.getItemPort(0)) + "   "+ jobListe.getItemFile(0)); 
    //Sollte Ip + Port + Dateiname direkt ausgeben.
    
    SetDlgItemText(IDC_STATIC_FILE,"Datei:			" + jobListe.getItemFile(0)); // Wird direkt angezeigt
    SetDlgItemText(IDC_STATIC_FILESIZE,"Datei-Größe:		 10,23 MB"); // Wird direkt angezeigt
    SetDlgItemText(IDC_STATIC_SPEED,"Geschwindigkeit:	 23,4 kb/s"); // Wird direkt angezeigt
    
    for(int i=0; i<=100; i++) //Einfache Progress Simulation
    {
         m_pr_Job.SetPos(i);  // Progress-Balken
    	_sleep(50);
    }
    jobListe.delItemFirst(); 
    m_Job.DeleteItem(0);  // Listenfeld: Löscht obersten Eintrag, nachfolgende Rücken nach, aber was außerhalb des schtbaren Feldes ist, rückt nicht nach
    
    SetDlgItemText(IDC_STATIC_JOBS,"Jobs: " + conIntToString(jobListe.size())); // Wird direkt angezeigt
    
    m_Info.InsertString(0,"Job verarbeitet und gelöscht"); // Wird in m_Info geladen aber nicht direkt angezeigt
    

    Also nochmal zusammengefasst:
    IDC_STATIC - wird direkt angezeigt
    ICD_LIST - wird bearbeitet aber erst nach Funktionsende angezeigt

    Ich glaub ja, dass die Lösung ziemlich simpel ist, aber ich komm einfach nicht drauf.

    In voller Hoffnung
    chackie-lee



  • Vielleicht m_Info.RedrawWindow() ?



  • Du musst die Messages abholen. In deinem Falle einfach nur die WM_Paint.

    Z.B. so:
    void DoPaintMessageLoop()
    {
    MSG message1;
    while(::PeekMessage(&message1,NULL,WM_PAINT,WM_PAINT, PM_REMOVE))
    {
    ::TranslateMessage(&message1);
    ::DispatchMessage(&message1);
    }
    }



  • Juppie, es funktioniert.

    Vielen Dank euch beiden.

    Gruß
    chackie-lee



  • Ist keine Lösung.
    GUI und Schleifen vertragen sich nunmal nicht.
    Informiere dich hier über Threads.
    GUI und Funktion sollte sowieso getrennt werden.


Anmelden zum Antworten