| |

VB.NET - FortgeschritteneZugriff aus Thread auf Steuerelement ohne ständiges Invoke | |  | Autor: lyris | Datum: 11.04.10 00:02 |
| Hallo, ich habe ein Performance-Problem und bekomme es nicht ganz in den Griff.
Da der Code insgesamt relativ umfänglich ist erstmal grob, was ich tue:
Ich möchte gerne ein relativ-performantes Sync-Tool schreiben um große Dateimengen zwischen zwei Speicherorten abzugleichen.
Ich habe eine Windows.Form Anwendung und eine Listbox.
Direkt in der Form analysiere ich die Unterschiede zwischen Quelle und Ziel und schreibe Deltas quasi in eine ArrayList. Sobald eine Differenz gefunden wurde, starte ich einen Thread, der sich darum kümmert, die Datei zu kopieren. Der Thread schnappt sich den/die Einträge und arbeitet sie ab. Ist die Liste nicht leer, startet der Thread sich neu und arbeitet den nächsten Eintrag ab, ist sie leer, setzte ich ein Flag damit ich in der Form selbst weiß: "Noch eine Änderung gefunden aber Thread war bereits fertig ==> Thread neu anstoßen".
Das funktioniert sehr gut nur würde ich jetzt gerne aus dem Thread heraus die Listbox mit Einträgen befüllen wie ("Datei xyz von a nach b kopiert"). Das mache ich bislang ungefähr so:
Public Partial Class MainForm
(...)
Private Sub ThreadCode()
(...)
UpdateList(" » Kopiere Datei: " & citem.sourceFile.FullName)
citem.sourceFile.CopyTo(citem.targetFile.FullName, True)
citem.sourceFile.Attributes = citem.targetFile.Attributes
(...)
If Me.Worklist.Count > 0 Then
Dim z As New System.Threading.Thread(AddressOf ThreadCode)
z.start
Else
CopyThreadActive = False
Exit Sub
End Sub
Delegate Sub GenericOneParamDelegate(ByVal ItemText As String)
Private Sub UpdateList(ByVal ItemText As String)
If ListBox.InvokeRequired then
Dim z As New GenericOneParamDelegate(AddressOf UpdateList)
Invoke (z, New Object() {ItemText})
else
Me.listBox.Items.Add(ItemText)
Me.listBox.Update()
end if
End Sub
End Class So: Ich gebe u.a. auch bei der Analyse der Dateien Infos in die Listbox aus und bei meiner Lösung bekomme ich zwar keine Probleme wegen Illegal Cross-References aber: Reihenfolgenprobleme, da das Invoke sehr viel Zeit kostet. Bspw. sehe ich, daß der CopyThread schon 4 Dateien kopiert hat, bis die Analyse abgeschlossen ist, in der Listbox taucht aber erst auf "Analyse abgeschlossen" und dann erst die Namen der kopierten Files und das obwohl die Funktion UpdateList lange vor der Ausgabe "Analyse abgeschlossen" mit den Dateinamen aufgerufen wurde.
Hat jemand eine Idee oder einen Ansatz, wie ich das schaffe, ohne das langsame Invoke ?
Ich habs schon mit Events probiert, die der Thread auslöst aber das geht nicht schneller da ich auf das Invoke nicht verzichten kann.
Beitrag wurde zuletzt am 11.04.10 um 00:15:06 editiert. |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
Neu! sevEingabe 3.0 
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|