tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von CPoly
  • 1 Beitrag von Shakie
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
263
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    Hallo zusammen,

    anbei eine kurze Frage zum folgenden Problem.

    ToDo:
    • Es sollen Dateien von a nach b kopiert werden
    • Es soll eine Progressbar angezeigt werden
    • Es sollen die einzelnen Kopierschritte in einer Listbox ausgegeben werden

    Idee:
    • Der Kopiervorgang muss in einem Thread ausgelagert werden
    • Die anzuzeigenden Steuerelemente werden ivoked

    Quellcode:

    -> Diese Methode wird irgendwann mal aufgerufen.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
         
    public void runThread()
    {
                t = new Thread(new ThreadStart(start));
                t.Start();
                progMain.Maximum = main.listBoxFiles.CheckedItems.Count;
                progMain.Minimum = 0;
    }

    -> In der Start-Methode wird geprüft, ob ein Invoke notwendig ist
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    public void start()
    {
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(start));
                    return;
                } 
     
         [... Irrelevanter Code ...]
     
        // Irgendwann werden hier die Update-Methoden aufgerufen
        mainProgressbar();
        updateListbox("irgendeintext");
     
        [... Irrelevanter Code ...]
    }

    -> Die Methoden für den Update

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    private void updateListbox(string value)
    {
                list.Items.Add(value);
                list.Update();
    }
     
    private void mainProgressbar()
    {
                progMain.Value++;
                progMain.Update();
     }

    Ergebnis:
    Grundsätzlich läuft das alles wunderbar.
    ProgressBar wird upgedatet und die Listbox erhält ihre Schritte.

    Problem:
    Wehe das Fenster verliert den Fokus -> Man klickt z.B. ein anderes Fenster in den Vordergrund oder wechselt mal die Applikation. Ab diesem Zeitpunkt werden die Fortschritte nicht mehr angezeigt. Erst wenn die Applikation komplett ferig ist, werden die Änderungen dargestellt.

    Was mache ich falsch? Was muss ich ändern oder beachten?

    Vielen Dank euch vorab,
    Gruß Marc
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ruf mal zusätzlich vor "Update()" noch "Invalidate()" des Progressbar auf. Denn zu "Update" steht in der Doku

    Causes the control to redraw the invalidated regions within its client area.
    Aber du hast ja nichts invalidiert. Ist aber nur ne Vermutung.
     

  3. #3
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    @CPoly: Danke für den Hinweis.
    Habe ich eingebunden. Leider ohne Erfolg. Die Maske bleibt eingefroren.
     

  4. #4
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Schade. Mir fällt ansonsten nur noch Application.DoEvents ein. http://msdn.microsoft.com/en-us/libr....doevents.aspx
    Marc79 bedankt sich. 

  5. #5
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    @CPoly: 100 Punkte****** Genau das löst mein Problem******!
    Vielen Dank! Wochenende gerettet
     

  6. #6
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Ich denke die richtige Lösung ist, das Invoke nur für das Aktualisieren der Progressbar zu verwenden, nicht aber für die Start-Methode. Denn so wie du es momentan machst, passiert Folgendes:
    1. Der Hauptthread A erstellt einen neuen Thread B
    2. Neu erstellter Thread B startet Methode "Start"
    3. Methode "Start" stellt fest, dass sie nicht auf dem Hauptthread A läuft. Daraufhin beendet sie sich in Thread B und startet sich neu in Thread A!
    Effektiv gesehen hast du keinen zweiten Thread erstellt. Alles wird in A bearbeitet.
    Was du aber wirklich willst, ist, dass "start" von Thread B bearbeitet wird, lediglich die Aufrufe zum Aktualisieren der Fortschrittsanzeige sollen per Invoke von Thread A bearbeitet werden. Die InvokeRequired-Prüfung gehört damit z.B. in die Methoden "updateListbox" und "mainProgressbar", anstatt in "start".
    Geändert von Shakie (13.08.11 um 23:41 Uhr)
    Marc79 bedankt sich. 
    hihi = -h²

  7. #7
    Marc79 Marc79 ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    69
    Danke für den Hinweis!
    Das löste zwar das Problem mit dem "Einfrieren" nicht ganz wirklich, aber technisch gesehen ist es nun auf jeden Fall sauber!
     

Ähnliche Themen

  1. Thread im Hintergrund mit Listener?
    Von Banchi im Forum Java
    Antworten: 0
    Letzter Beitrag: 23.12.08, 22:11
  2. Thread A stösst Änderung in Thread B an. Aber wie?
    Von BeaTBoxX im Forum .NET Café
    Antworten: 12
    Letzter Beitrag: 13.12.06, 11:52
  3. After Effects - Maske von Maske abziehen
    Von bigbanana3000 im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 28.10.06, 15:11
  4. Maske über Maske ?
    Von zirag im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 13.01.05, 15:54
  5. Antworten: 19
    Letzter Beitrag: 12.07.02, 11:13

Stichworte