Benutzer mit den meisten Antworten
Controls in Window über Thread aktualisieren

Frage
-
Hallo, ich brauche mal Hilfe um einen klaren Kopf zu bekommen. Ich habe eine Anwendung, in der ich viele Dateien verarbeite und in eine SQL-Datenbank schreibe. Die Dateien werden zuerst noch aus verschiedenen Verzeichnissen in ein großes Sammelverzeichnis kopiert. Im Window sind diverse Labels und ListBoxen in die Daten eingetragen werden, die schon verarbeitet wurden. Diese Controls würde ich gerne parallel aktualisieren lassen. Genauso würde ich gerne während der Bearbeitung an einem Scrollbalken ziehen, um die Daten in der Liste durchzusehen, was aber so nicht geht. Ich brauche also ein Thread. Jetzt habe ich mir mal das mit Thread und der TPL angesehen, weil mit dem kopieren der vielen Dateien die TPL wohl interessanter wäre. Ich hatte dann mal eine Methode von mir in die Task.Klasse gepackt. Wird die MEthode abgearbeitet, motzt irgendwann der Compiler, weil ich ein Label aktualieseren will, auf den schon ein anderer Thread zugreift (und ich denke das ist der Thread von der eigentlichen GUI (Window) in der das Label zu Beginn initialisiert wird). Wie mache ich das nun? Es wird wohl immer so sein das man eine Window mit seinen Controls erzeugt, und aber eine Methode aufruft die irgend etwas macht und die Text-Eigenschaft der Controls ändert. Kann mir dazu jemand helfen (das erste mal das ich Threads anrühre).
- Typ geändert Robert BreitenhoferModerator Freitag, 29. Juni 2012 16:39 Frage
Antworten
-
Hallo,
Steuerelemente darfst Du nur über den GUI-Thread (der sie erstellt hat) aktualisieren.
Deswegen muss der Aufruf über Control.Invoke erfolgen, siehe dazu:
http://stackoverflow.com/questions/1423446/thread-control-invokeBei der TPL kannst Du auch TaskScheduler.FromCurrentSynchronizationContext-Methode verwenden.
Einige Beispiele dazu findest Du in Parallel Programming: Task Schedulers and Synchronization Context
(Falls Du konkretere Hinweise zu Deiner Aufgabenstellung brauchst, so beschreibe sie näher).
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 29. Juni 2012 16:39
-
Hallo,
wie schon geschrieben:
Du braucht in solchen Fällen nun einmal Control.Invoke (oder eine der anderen Konstrukte).Bitte lies die oben angegebenen Artikel.
Ein Beispiel kann ich Dir schon geben, wenn Du Verständnisschwierigkeiten hast.
Nur solltest Du dann Deinen Code zeigen - sonst musst Du ggf. wieder um die Ecke denken ;-)Für die beschriebene Aufgabe kannst Du auch auf einen BackgroundWorker zurückgreifen,
der erledigt das für Dich.Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. Juli 2012 09:47
Alle Antworten
-
Hallo,
Steuerelemente darfst Du nur über den GUI-Thread (der sie erstellt hat) aktualisieren.
Deswegen muss der Aufruf über Control.Invoke erfolgen, siehe dazu:
http://stackoverflow.com/questions/1423446/thread-control-invokeBei der TPL kannst Du auch TaskScheduler.FromCurrentSynchronizationContext-Methode verwenden.
Einige Beispiele dazu findest Du in Parallel Programming: Task Schedulers and Synchronization Context
(Falls Du konkretere Hinweise zu Deiner Aufgabenstellung brauchst, so beschreibe sie näher).
Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 29. Juni 2012 16:39
-
Hallo oema,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo, bin wieder am probieren mit Threads. Und zwar gibt es eben Probleme mit Controls (Label-Contents aktualisieren, Progressbarfortschrittsanzeige ...).
Ich habe ein Window mit der ganzen Oberfläche (alle Controls). Das ict meine Startoberfläche die bei Programmstart gestartet wird. Dann lasse ich über einen Button-Click vielw Dateien kopieren und dazu Informationen über denFortschritt und die Dateinamenausgabe anzeigen. Da es viele Dateien zum kopieren sind wollte ich das mit Parallel.For() realisieren, oder auch einfach mal ineinem eigenen Thread. Hatte ich dann soweit versucht und den Thread gestartet. Wenn dann im Thread als erstes die ProgressBar aktualisiert wird, krachts ("Gehört einem anderen Thread"). Liegt das Problem darin, das ich dieses Window nicht als Startwindow verwenden darf, da ja die Controls in diesem Primärthread angelegt werden, und aber dann auch im Sekundärthread verwendet werden? Oder muss ich eine Synchronisation einbauen?
-
Hallo,
wie schon geschrieben:
Du braucht in solchen Fällen nun einmal Control.Invoke (oder eine der anderen Konstrukte).Bitte lies die oben angegebenen Artikel.
Ein Beispiel kann ich Dir schon geben, wenn Du Verständnisschwierigkeiten hast.
Nur solltest Du dann Deinen Code zeigen - sonst musst Du ggf. wieder um die Ecke denken ;-)Für die beschriebene Aufgabe kannst Du auch auf einen BackgroundWorker zurückgreifen,
der erledigt das für Dich.Gruß Elmar
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. Juli 2012 09:47