VisualBasic Multithreading Problem

SneezR

Cadet 4th Year
Registriert
Sep. 2011
Beiträge
103
Moin moin liebe Community,

Ich habe bei meiner Software ein kleines Problemchen. :S

Und zwar möchte ich rechenintensiven Code mittels Multithreading auslagern
Das ganze Spielt sich so ab


Button_click -> neuer thread(addressof abc)

abc(
einstellungen vornehmen ...
aufruf des rechenintesiven codes)

Nun lasse ich schon im ri Code ein Refresh-Event der form aufrufen und zwar alle 500 Datensätze, wenn man hierbei einmal in die Form klickt bleibt sie solange ohne rückmeldung bis eben diese 500 DS erreicht sind.
Diesen Wert kleiner zu wählen habe ich auch bereits gemacht, es ging auch allerdings war es sehr unschön und ich möchte das halt nun jetzt einfach mit diesen 500 DS haben.

Kann mir hierbei jemand weiterhelfen, falls Informationen fehlen kann ich diese gerne bereitstellen :)

MfG SneezR-.^
 
Du möchtest irgendeine Rechenintensive Operation ausführen und auf der Oberfläche dem Benutzer eine Rückmeldung geben? Habe ich das richtig verstanden?
Das lässt sich gut mit einem Backgroundworker erledigen..
 
Richtig momentan ist es wie folgt aufgebaut

Button_Click [
Dim t As New Thread(AddressOf Me.abc) ' neuen Thread deklarieren
t.Start() ' Thread starten
t.Join() ' Auf Beenden des Threads warten
]

Function abc [
Einstellungen vornehmen...
{Aufruf rechenintensiver Funktion}
]

Function rechenintensiv [
Schleife (
immer wieder Änderungen an der Form vollziehen zB. neue Werte
bei Wert XX -> Form.Refresh
)
]
 
Ohne mich in VB auszukennen - wenn du natürlich join aufrufst, dann ist es doch nicht mehr "multithreaded" sondern immer noch single. Das Ziel ist doch, dass dein Fenster weiterhin reagiert und nicht auf die Berechnung wartet.
 
Wie gesagt, mit nen Backgroundworker gehts relativ einfach.

Ziehe einfach einen Backgroundworker auf die Form.

damit du dem Benutzer Rückmeldung auf der Form geben kannst brauchst du einen Delegate.
Code:
 Private loadingDelegate As New MethodInvoker(AddressOf Loading)


Hiermit wird der Backgroundworker gestartet, musst du mit dem Button Click aufrufen
Code:
bw.RunWorkerAsync()

als nächstes brauchst du das doWork Ereignis. Zunächst wird die loading Methode aufgerufen, die dem benutzer in irgendeiner Form rückmeldung gibt. Bei mir per Progressbar.
Anschließend rufst du deine abc Function auf.

Code:
Private Sub bw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
        Me.Invoke(loadingDelegate)
        Me.abc()
End Sub

In der Loading Methode kannst du die Progressbar starten.

Code:
Private Sub Loading()
        Me.tsProgress.Style = ProgressBarStyle.Marquee
End Sub

Ich hoffe ich konnte dir etwas helfen ;)
 
Sie reagiert ja auch noch und beim Button_Click-Event habe ich nach dem t.Join noch ein paar Einstellungen beispielsweise die aufrufende Form wieder sichtbar zumachen und ohne dem Join ist diese gleich wieder sichtbar

Hast du dafür evtl eine Lösung?
 
SneezR schrieb:
beim Button_Click-Event habe ich nach dem t.Join noch ein paar Einstellungen beispielsweise die aufrufende Form wieder sichtbar zumachen
Dann häng dich einfach noch ans RunWorkerCompleted-Event des BackgroundWokers, das aufgerufen wird wenn er fertig ist. Da kannst du deine Einstellungen problemlos machen.
 
Zuletzt bearbeitet:
Also ich hab's jetzt mal auf bgw umbeschrieben und dort dauert es dann ca. 5x solang :S
 
Zurück
Oben