Thread + Interface

C-H

Erfahrenes Mitglied
Hallo!

Ich verwende eine ListView um Daten darzustellen, die alle x Sek. aktualisiert werden. Durch BeginUpdate bzw. EndUpdate wird soll ein neuzeichnen verhindert werden. Das funktionierte auch solange, bis ich die Funktion in ein Thread gepackt habe. Jetzt blinkt das Listview, was ziemlich nervig ist ;-)

Kennt jemand eine Lösung?
 
Hallo C-H!

Wenn Du mit Infos kleckerst und ich daher nicht weiss wie das bei Dir jetzt ausschaut, kann ich nur raten.
  • Läuft aktualisieren im Thread in einer Schleife?
    Dann sollte es IMHO keine Probleme geben.
  • Oder löst ein Event jeweils den Thread aus?
    Wenn ein Event ausgelöst wird und der Thread schon läuft könntest Du einen Timer starten,
    der wartet bis der Thread abgearbeitet wurde und den Thread danach nochmal startet.
    Da das Aktualisieren ja auch mal länger als der Aktualisierungsintervall dauern kann.
    Deaktivier den Timer beim nächsten aktualisieren aber wieder damit er nicht unnötig aktualisiert wird.
Poste doch mal den Quellcode bitte wenn so nicht weggeht.

Btw. kannst Du Dir hier das Worker-Thread Starter Kit mal anschaun
Das ist viel effizienter. ;)
[thread=199136]Threading hilfe - Thread[/thread]

MfG, cosmo
 
Danke für deine Antwort.

Es läuft ein Timer der alle (je nach Einstellung) x Sek. ein "Tick"-Event auslöst und darin den Thread startet. Der Thread wird auch in der Event-Sub deklariert. Das habe ich gemacht, da ich bisher immer Probleme hatte einen Thread neuzustarten.

Das mit dem warten, bis der Thread beendet ist, habe ich auch schon probiert, allerdings aus einem anderen Grund. Hat aber das blinken nicht beseitigt.
 
da ich bisher immer Probleme hatte einen Thread neuzustarten
Wenn der Thread noch läuft kann er auch nicht neu gestartet werden.
Code:
Thread.IsAlive (!)
Wenn Du sagst das Du ihn im Timer-Event erstellst, wird bei Dir also immer ein neuer Thread gestartet
und alle greifen demzufolge gleichzeitig auf den ListView zu wenn der vorherige Thread noch nicht fertig war.
Ergo auch das flackern, anders kann ich mir das jetzt nicht vorstellen.
  1. Definiere den Thread also global.
  2. Prüfe im Timer ob der Thread noch lauft, wenn nicht --> dann aktualisieren
MfG, cosmo
 
Hallo!

Ich habe die Lösung gefunden. Das Problem war, dass das von mir verwendete Control in einem anderen Thread erstellt wurde als dem, der das Control aktualisiert. Die Lösung liegt (wie so oft) in wenigen Zeilen Code:

Man erstellt ein Delegate
Public Delegate Sub meinDelegate()
der den gleichen Aufbau (also Parameter) wie die Sub hat, also z.B.
Private Sub meineSub()

End Sub

und ruft das ganze mit
meinControl.BeginInvoke(New meinDelegate(AddressOf meineSub))

Falls Parameter übergeben werden sollen sieht das so aus:

meinControl.BeginInvoke(New meinDelegate(AddressOf meineSub, New Object() {Parameter}))
 
Zurück