2Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
263
263
EMPFEHLEN
-
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
-
Ruf mal zusätzlich vor "Update()" noch "Invalidate()" des Progressbar auf. Denn zu "Update" steht in der Doku
Aber du hast ja nichts invalidiert. Ist aber nur ne Vermutung.Causes the control to redraw the invalidated regions within its client area.
-
@CPoly: Danke für den Hinweis.
Habe ich eingebunden. Leider ohne Erfolg. Die Maske bleibt eingefroren.
-
Schade. Mir fällt ansonsten nur noch Application.DoEvents ein. http://msdn.microsoft.com/en-us/libr....doevents.aspx
-
@CPoly: 100 Punkte****** Genau das löst mein Problem******!
Vielen Dank! Wochenende gerettet
-
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:
- Der Hauptthread A erstellt einen neuen Thread B
- Neu erstellter Thread B startet Methode "Start"
- 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!
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)
hihi = -h²
-
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
-
Thread im Hintergrund mit Listener?
Von Banchi im Forum JavaAntworten: 0Letzter Beitrag: 23.12.08, 22:11 -
Thread A stösst Änderung in Thread B an. Aber wie?
Von BeaTBoxX im Forum .NET CaféAntworten: 12Letzter Beitrag: 13.12.06, 11:52 -
After Effects - Maske von Maske abziehen
Von bigbanana3000 im Forum Videoschnitt, Videotechnik & -produktionAntworten: 2Letzter Beitrag: 28.10.06, 15:11 -
Maske über Maske ?
Von zirag im Forum Flash PlattformAntworten: 3Letzter Beitrag: 13.01.05, 15:54 -
max - c4d (Thread split by IKEAFREAX on 09.07.2002 23:43 (thread by pasq))
Von pasq im Forum 3D Studio MaxAntworten: 19Letzter Beitrag: 12.07.02, 11:13





Zitieren

Login





