Problem mit der blöden Progress Bar


  • Mod

    Die Frage ist wie oft diese aufgerufen werden, oder - wenn Du alle diese Infos immer im Verbund setzt - ob Du nicht entsprechende variablen schaffst die der Mainthread dan verwendet und anzeigt.



  • toxor schrieb:

    OHYEA es funktioniert, lag tatsächlich daran !! Vielen Dank für die Infos, auch an AndyDD und CTecS aus dem anderen Thread 🙂

    Aber noch ne Frage, ich hab ungefähr 20 von diesen pThis->GetDlgItemText... Operationen im Thread, muss ich für jede so ne Message erfinden ?

    Kommt drauf an was du machen willst. Du hast ja noch wparam und lparam als Parameter in PostMessage. Die könntest du für weitere Informationen vom Thread an die GUI verwenden.



  • Naja ich hab im Hauptthread Zeilen die ich auslesen will ( während der Thread läuft ) und ich mach das halt atm noch mit pThis->GetDlgItemText(IDC_BLA...). Ich frag mich halt ob auch dort ein gewisses Fehlerpotential vorhanden ist ( festgestellt hab ich bisher nichts ).

    Und noch ne Frage, ich hab in meiner Prozent anzeige ein leichtes Flimmern, und hab insgeheim gehofft das dieses verschwindet wenn ich die Message "sauber" aus dem Thread bringe.

    Ich mach das halt jetzt so :

    LRESULT CFTP2Dlg::OnStr(WPARAM, LPARAM)
    {
    	m_Fenster.strPercent = "0 % (0 / 0 Bytes)";
    	m_Fenster.strPercent.Format("%i %% (%i / %i Bytes)",m_Fenster.nPercent, m_Fenster.nPosProgressBar, m_Fenster.nFileSize); 
    	m_Fenster.m_Per = m_Fenster.strPercent;
    	m_Fenster.SetDlgItemText(IDC_BLA_F,m_Fenster.m_Per);
    	m_Fenster.m_Progress.SetPos(m_Fenster.nPercent);
    	m_Fenster.m_Progress.SetRange(0,100);
    	m_Fenster.m_Progress.SendMessage(PBM_SETBARCOLOR, 0, (LPARAM)RGB(0, 255, 0));
    
    	return 0;
    }
    

    Aufruf im Thread :

    AfxGetMainWnd()->PostMessage(UWM_STR);
    

    Funktionieren tut es, allerdings flimmert die Anzeige nachwievor ( nicht viel, aber man sieht es ).
    Weiss jemand was man dagegen tun kann ?



  • Was flimmert, nur die Prozentanzeige oder die gesamte Progressbar? Ich kenn mich mit so einer Fortschrittsanzeige nicht aus, aber regelt die selbst das Neuzeichnen oder musst du das per UpdateWindow anstoßen?
    Wann wird denn die Message rausgeschickt? Die sitzt doch bestimmt in einer Schleife. Du solltest die nur absetzen, wenn sich was geändert hat. Möglicherweise zeichnet sich das Teil wiederholt selbst ohne das sich an der Anzeige wirklich was verändert hat.



  • Ja, lediglich die Prozentanzeige flimmert, und das nach dem Moto : Je schneller der Upload-speed desto krätiger wird geflimmert. Also bei langsamen Upload fällts eigentlich gar nicht auf.
    Ich brauch kein UpdateWindow aufrufen, weder beim Status der ProgressBar noch bei der Prozentanzeige. Zumindest mach ich das nicht ^^.
    Ja die Message wird immer am Ende einer while Schleife rausgeschickt, allerdings wird jedes einzelne Bite angezeigt, also ändert sich ständig was, solnage hochgeladen wird.



  • toxor schrieb:

    Ja, lediglich die Prozentanzeige flimmert, und das nach dem Moto : Je schneller der Upload-speed desto krätiger wird geflimmert. Also bei langsamen Upload fällts eigentlich gar nicht auf.
    Ich brauch kein UpdateWindow aufrufen, weder beim Status der ProgressBar noch bei der Prozentanzeige. Zumindest mach ich das nicht ^^.
    Ja die Message wird immer am Ende einer while Schleife rausgeschickt, allerdings wird jedes einzelne Bite angezeigt, also ändert sich ständig was, solnage hochgeladen wird.

    Das dachte ich mir. Dann wirst du sicher das mit der Anzeige ändern müssen. Ein Ansatz (weiß nicht ob man das so machen kann) wäre, die Anzeigerei z.B. über einen Timer zu steuern, der alle (wegen mir 500 ms) die Anzeige aktualisiert. Dann stellt der Thread per Message nur den String für die Anzeige und den int-Wert für die Progressbar zur Verfügung und in der OnTimer kannst du ja dann das an die Dialogfeldelemente übergeben.



  • Danke für den Tip werds versuchen :p


  • Mod

    Das Flimmern entsteht dadurch, dass Du immer Setrange ausführst oder auch immer wieder die Farbe neu setzt!
    Führe SetRange nur einmal aus und auch das initialisieren mit der Farbe, und dann nur noch SetPos.

    1. Es ist doch absolut sinnfrei diesen Code immer wieder auszuführen.
    2. Es wäre es ebenfalls Sinnfrei immer wieder die Textfelder zu setzen wenn sich nichts geändert hat... (nur so als Anmerkung)



  • Martin Richter schrieb:

    Das Flimmern entsteht dadurch, dass Du immer Setrange ausführst oder auch immer wieder die Farbe neu setzt!
    Führe SetRange nur einmal aus und auch das initialisieren mit der Farbe, und dann nur noch SetPos.

    1. Es ist doch absolut sinnfrei diesen Code immer wieder auszuführen.
    2. Es wäre es ebenfalls Sinnfrei immer wieder die Textfelder zu setzen wenn sich nichts geändert hat... (nur so als Anmerkung)

    Genau das wollte ich auch sagen. Eventuell hilft es schon wie Martin sagt die entsprechenden Codeteile auszulagern. Dann kannst du auch auf die Timervariante verzichten.



  • Mit Setrange und farbe setzen hast du Recht, aber die Textfelder muss ich doch immer wieder neu setzen, da sich ja während des uploads ständig was ändert. Wie soll ich die Prozentanzeige den sonst realisieren, wenn nicht in der Schleife.


  • Mod

    Solange Du so etwas nur dann machst wenn sich auch etwas ändert ist das OK!


Anmelden zum Antworten