[VisualBasic] [.Net] Multithreading

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Knusperkeks, 27. Juni 2007 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 27. Juni 2007
    [.Net] Multithreading

    Ich will in nem programm von mir ne liste an daten abarbeiten und benutz dazu threads: nur wenn die liste 100 eintrage hatt wollte ich ungerne auch 100 threads benutzen daher meine frage:

    ich will das es z.b. nur 3 threads gib die so arbeiten:
    Thread 1: bearbeite arrURL(0)
    Thread 2: bearbeite arrURL(1)
    Thread 3: bearbeite arrURL(2)

    wenn thread 1 fertig dann soll er mit arr(3) weiterarbeiten usw ...

    so lass ich den ersten thread die aufgabe abarbeiten:
    Code:
     Dim tasks As New TaskClass
     Dim thread1 As New System.Threading.Thread(AddressOf tasks.start)
     tasks.sURL = arrURl(0)
     thread1.Start()
     thread1.Join()
     txtLinks.Text = tasks.RetVal
    wie kann ich das lösen das ich mit 3 threads den komplettena rray abarbeiten kann?!

    ein logischer Ansatz reicht auch schon!

    Knusperkeks
     
  2. 27. Juni 2007
    AW: [.Net] Multithreading

    Du machst eine Globale Variable am besten, in der Speicherst du die Nummer des nächstens
    Eintrags. Und in dem Thread (in den Thrads) speicherst du den globalen Wert in einer anderen
    Variable und inkrementierst die globale, und wenn die globale den Letzten Eintrag erreicht
    dann soll sich der jeweiligen Thrads schliessen da sie nicht mehr benötigt werden.

    Mit der lokalen Variable, die zwischen Speicherst, hasst du dann immer die Nummer die noch nicht Bearbeitet wurde.

    Mfg Rushh0ur
     
  3. 27. Juni 2007
    AW: [.Net] Multithreading

    Das mit der globalen zählervariable hab ich mir auch shcon überlegt nur wie mach ich es, das das ich dann dynamisch die thread erzeuge und auch nicht mehr als die von mir angegeben threadanzahl benutze?

    Knusperkeks
     
  4. 27. Juni 2007
    AW: [.Net] Multithreading

    Les dich schlau:
    Klick
     
  5. 28. Juni 2007
    AW: [.Net] Multithreading

    Bin da jetzt net so der .NET Profi, aber in vb6 würd ichs so machen:

    is zwar vb6 aber vom Prinzip sollte das ja auch gehen, oder?

    MfG
     
  6. 28. Juni 2007
    AW: [.Net] Multithreading

    Ich gucks mir mal an danke

    Naja so hatte ich das auch shcon überlegt, aber wenn die for schleife nun im 2ten durchlauf ist dann hat thread(i) ja den inhalt von arr(2)! Das hat aber doch im ersten durchlauf schon thread(i+1) behandelt!? Oder denke ich da völlig falsch?!

    Knusperkeks
     
  7. 28. Juni 2007
    AW: [.Net] Multithreading

    Da hast du nicht recht, da "Step 3" soviel bedeutet wie: Am Anfang ist i=1, 2ter Durchlauf i=4, 3ter Durchlauf i=7, usw...

    Da müsste nur noch eine Bedingung rein, damit "Threat(i+2)" bei Zahlen die nicht durch 3 teilbar sind am Ende nicht mehr mitläuft.

    Also sowas wie: If i+2<= Ubound(Liste) Then


    Ups..: Hab nicht gesehen das "Ubound(Liste)" durch "3" geteilt wird und "Step 3" ist. Irgendwas stimmt da nicht, würde das "/3" weglassen



    EDIT:
    Wird das bei der Art von Aufbau nicht trotzdem nacheinander abgearbeitet?
     
  8. 28. Juni 2007
    AW: [.Net] Multithreading

    Hallo Knusperkeks,

    ich würd versuchen, mir die IDs von den einzelnen Threads zu merken. Damit kann man den Thread sicher über eine Shared function aus System.Threading zurückholen.

    Eine gute Möglichkeit neben Try and Error um das heraus zu finden ist Lutz Roeder's .Net Reflector
    .NET Reflector - Understand and debug any .NET code
    (Email muss zum Download angegeben werde, hab aber noch nichts von ihm bekommen, hab das Tool schon einige Monate).

    Du könntest die Threads in einer ArrayList halten (die Collection nimmt Objekte vom Typ Object an).

    Was mir noch einfällt: Du könntest die Informationen, die Du über die Threads (Tasks) haben willst in eine Datei oder Datenbank zurückschreiben und sie dir dann von einem anderen Thread aus auslesen (dem "Standard"-Thread, also der mit dem Du Dein Programm ausführst).

    Spontan auf Drei ist es das jetzt erstmal.

    BG MaxDev
     
  9. 28. Juni 2007
    AW: [.Net] Multithreading

    Schau dir mal das Queue-Objekt im System.Collections-Namespace an.

    Da kann man mit .Enqueue Objekte speichern und mit .Dequeue Werte wieder 'abholen'.

    Also, in C# sieht das so aus:
    Code:
     Queue test = new Queue();
     test.Enqueue("asdf");
     test.Enqueue(123);
     test.Enqueue(1);
     test.Enqueue(5234);
     Console.WriteLine(test.Dequeue()); // Gibt "asdf" zurück
     Console.WriteLine(test.Dequeue()); // Gibt 123 zurück etc..
    
    Dequeue holt den ersten Wert (Queue ist ein First-In-First-Out-Typ) und löscht das Element danach. D.h. mit Dequeue verkleinerst du die Queue und verhinderst, dass ein Element 2 mal bearbeitet wird.

    Jetz speicherst du als Objekte in der Queue einfach die Sachen (in deinem Fall die URLs), die die Threads bearbeiten sollen. Wenn jetz ein Thread fertig is, holt er sich einfach das nächste Element (mittels Dequeue). Wenn keine Elemente mehr übrig sind, kann sich der Thread selber löschen.

    Eventuell musst du nur wegen der Threadsicherheit aufpassen.
     
  10. 28. Juni 2007
    AW: [.Net] Multithreading

    Irgendwie hab ich das Gefühl, da wird falsch verstanden was ein Thread ist....
    Ein Thread ist doch eine Funktion die Asynchron mit dem Hauptthread läuft.


    Hab hier ein Beispiel zusammen Geschrieben, das alles deutlich machen müsste:

    Code:
     [COLOR="Green"]REM Globale Variablen[/COLOR]
     [COLOR="Blue"]Dim [/COLOR]Position [COLOR="Blue"]As Integer[/COLOR]
     [COLOR="Blue"]Dim [/COLOR]ThreadsRunning [COLOR="Blue"]As Integer[/COLOR]
     [COLOR="Blue"]Dim [/COLOR]Threads(3) [COLOR="Blue"]As [/COLOR]System.Threading.Thread
    
     [COLOR="Green"]REM Optional[/COLOR]
     [COLOR="Blue"]Dim [/COLOR]arrURL(20) [COLOR="Blue"]As String[/COLOR]
    
     [COLOR="Green"] REM ThreadFunktion[/COLOR]
     [COLOR="Blue"] Private Sub[/COLOR] Thread_Funk()
     ThreadsRunning += 1
    
     [COLOR="Green"]REM beende den Thread wenn am ende des Arrays angekommen[/COLOR]
     [COLOR="Blue"]While [/COLOR](Position < arrURL.Length)
     [COLOR="Green"]REM Bearbeite den Position Eintrag im Array[/COLOR]
    
     Position += 1
     [COLOR="Blue"]End While[/COLOR]
    
     [COLOR="Green"] REM Von einer Anderen Funktion kann geprüft werden ob
     REM ein Thread läuft[/COLOR]
     ThreadsRunning -= 1
     [COLOR="Blue"]End Sub[/COLOR]
    
    
     [COLOR="Blue"]Private Sub[/COLOR] Button1_Click([COLOR="Blue"]ByVal [/COLOR]sender [COLOR="Blue"]As [/COLOR]System.Object, [COLOR="Blue"]ByVal [/COLOR]e [COLOR="Blue"]As [/COLOR]System.EventArgs) Handles Button1.Click
     Position = 0
     ThreadsRunning = 0
    
     [COLOR="Blue"]Dim [/COLOR]I [COLOR="Blue"]As Integer[/COLOR]
    
     [COLOR="Blue"]For [/COLOR]I = 0 [COLOR="Blue"]To [/COLOR]2
     [COLOR="Green"]REM Threads in einer Schleife erstellen und Starten[/COLOR]
     Threads(I) = New System.Threading.Thread(AddressOf Thread_Funk)
     Threads(I).Start()
     [COLOR="Blue"]Next [/COLOR]I
    
     [COLOR="Green"]REM Um Fehler zu verhindern sollte Sicher gestellt werden das diese Funktion
     REM nicht noch einmal aufgerufen wird solange die Threads noch laufen[/COLOR]
     [COLOR="Blue"]End Sub[/COLOR]
    
    Es werden also 3 Thread erstellt und gestartet, dh der Code der in "Thread_Funk" steht wird
    dreimhl Parallel abgearbeitet.

    Hoffe das kann helfen

    Mfg Rushh0ur
     
  11. 28. Juni 2007
    AW: [.Net] Multithreading

    Code:
    Private Sub tsStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsStart.Click
     Dim tasks As New TaskClass
     Dim t As New System.Threading.Thread(AddressOf tasks.start)
     Dim t2 As New System.Threading.Thread(AddressOf tasks.start)
     Dim t3 As New System.Threading.Thread(AddressOf tasks.start)
     Dim i As Long
     i = 1
     For Each item As Object In cmbURL.Items
     r.Enqueue(cmbURL.Items.Item(i - 1).ToString)
     i += 1
     Next
    
     While r.Peek <> ""
     tasks.sURL = r.Dequeue()
     t.Start()
     tasks.sURL = r.Dequeue()
     t2.Start()
     tasks.sURL = r.Dequeue()
     t3.Start()
     t.Join()
     txtLinks.Text = tasks.RetVal
     t2.Join()
     txtLinks.Text = tasks.RetVal
     t3.Join()
     txtLinks.Text = tasks.RetVal
     End While
     End Sub
    hab das jetzt wie pyro mit so nem komischen objekt gemacht, aber sobald ich mehr als 3 links habe macht er nicht mehr und gibt nen fehler aus!

    ich will das der die Liste mit den 3 threads abarbeitet!

    Nur wenn der dann in das 2te mal die while schleife anfängt sagt er das der thread schon beendet wurde!

    Knusperkeks
     
  12. 28. Juni 2007
    AW: [.Net] Multithreading

    Nash hat Recht .. das /3 müsste daraus

    Bei mir sieht das in ner .NET Konsolenanwendung folgendermaßen aus:

    Code:
    Module Module1
    
     Sub Main()
     Dim i As Integer
     Dim strTest(100) As String
    
     'Dummy Array das abgearbeitet werden soll..
     For i = 0 To 100
     strTest(i) = "Nr " & i
     Next
    
     For i = 0 To 100 Step 3
     Console.WriteLine(strTest(i) & ".")
     Console.WriteLine(strTest(i + 1) & ".")
     Console.WriteLine(strTest(i + 2) & ".")
     Next
    
     i = Console.ReadLine()
    
     End Sub
    
    End Module
    
    evtl. hilfts
     
  13. 28. Juni 2007
    AW: [.Net] Multithreading

    Musst du denn immer den "t.Start()" machen?

    Kenne mich da nicht so aus, aber das kommt mir irgendwie komisch vor.
    Wo was gestartet wird sollte es irgendwo auch beendet werden, bevor es wieder gestartet wird.

    mfg
     
  14. 28. Juni 2007
    AW: [.Net] Multithreading

    Ich erlaube mir mal den Code zu verbessern. Du hast mich da irgendwie falsch verstanden ^^

    Am besten wäre noch, du lagerst die Threadfunktion in eine Threadfunktion aus.
    So z.B.:

    Code:
    Public Sub ThreadFunc
     Dim sURL As String
     while r.Peek <> "" 'Schauen ob noch was da is
     sURL = r.Dequeue() 'HOlt das nächste Element aus der queue
     '
     ' Hier machst du deinen Code rein, der die URL bearbeitet
     ' 
     Console.Writeline("Ergebnis: ...") 'Hier das Ergebnis verarbeiten (Speichern, ausgeben o.ä.)
     End while
     Thread.End 'Thread beenden
    End Sub
    
    

    Hoffe mal das ganze funktioniert. Ich hab kein VB.NET da um das auszuprobieren.
     
  15. 28. Juni 2007
    AW: [.Net] Multithreading

    Ich gebs auf ich versteh das ganze nicht und es will auch irgenwie nicht funktionieren!

    wenn einer sich den kopf zerbrechen will dann kann er gerne den source haben!

    //ich les mich nochmal von vorne in das thema ein und dann versuch ich das mal zu überarbeiten

    Knusperkeks
     
  16. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.