5 Threads - 1 Problem

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    5 Threads - 1 Problem

    Hallo ihr lieben,


    ich habe da ein Problem. Ich arbeite nicht so oft mit Multithread weswegen ich das lieber abklären möchte.

    Ich muss 1.000.000 abfragen machen. Diese wollte ich auf 5 Threads aufteilen so das jeder Thread "nur" 200.000 abfragen hat. Ich habe keine Textdatei o.ä weswegen ich an eine Schleife dachte.

    Ich habe da nur das Logikproblem wie ich die nächst-freie Zahl an den Thread übergebe und sie nicht ausversehen die gleiche Zahl nehmen. Ich hoffe man versteht was ich meine.

    Ich dachte daran die 1.000.000 in einer Array zu generieren und die verbrauchte Zahl immer zu löschen. (geht ein Array überhaupt so weit?)

    Mein Code bislang ist nicht sehr aussagekräftig und hat keinen wirklichen ansatz da ich nicht weis wie ich an die Sache am besten ran gehe.

    Thread 1 nimmt die Zahl 1 und Löscht die Zahl 1 aus dem Array
    Thread 2 nimmt die Zahl 2 und Löscht die Zahl 2 aus dem Array
    Thread 3 nimmt die Zahl 3 und Löscht die Zahl 3 aus dem Array
    Thread 4 nimmt die Zahl 4 und Löscht die Zahl 4 aus dem Array
    Thread 5 nimmt die Zahl 5 und Löscht die Zahl 5 aus dem Array
    Thread 1 nimmt die Zahl 6 und Löscht die Zahl 6 aus dem Array
    Thread 2 nimmt die Zahl 7 und Löscht die Zahl 7 aus dem Array
    Thread 3 nimmt die Zahl 8 und Löscht die Zahl 8 aus dem Array
    Thread 4 nimmt die Zahl 9 und Löscht die Zahl 9 aus dem Array

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Dim thread1 As New System.Threading.Thread(AddressOf GrabThread1Sub)
    3. Dim thread2 As New System.Threading.Thread(AddressOf GrabThread2Sub)
    4. Dim thread3 As New System.Threading.Thread(AddressOf GrabThread3Sub)
    5. Dim thread4 As New System.Threading.Thread(AddressOf GrabThread4Sub)
    6. Dim thread5 As New System.Threading.Thread(AddressOf GrabThread5Sub)
    7. Dim GrabThread1 As Boolean = False
    8. Dim GrabThread2 As Boolean = False
    9. Dim GrabThread3 As Boolean = False
    10. Dim GrabThread4 As Boolean = False
    11. Dim GrabThread5 As Boolean = False
    12. Private Sub GrabThread1Sub()
    13. End Sub
    14. Private Sub GrabThread2Sub()
    15. End Sub
    16. Private Sub GrabThread3Sub()
    17. End Sub
    18. Private Sub GrabThread4Sub()
    19. End Sub
    20. Private Sub GrabThread5Sub()
    21. End Sub
    22. Private Sub btn_grab_Click(sender As Object, e As EventArgs) Handles btn_grab.Click
    23. 'Schleife oder ähnliches?
    24. If GrabThread1 & GrabThread2 & GrabThread3 & GrabThread4 & GrabThread5 = False Then
    25. 'Hier kommt die Funktion die die Nummer an den Thread übergibt
    26. End If
    27. End Sub
    28. End Class


    Wie würdet ihr das Problem lösen?
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    C.O.D.E schrieb:

    If GrabThread1 & GrabThread2 & GrabThread3 & GrabThread4 & GrabThread5 = False Then


    In VB werden String mit & verkettet. Ein logisches & ist in VB And

    Guck mal was die MessageBox dir anzeigt.
    MessageBox.Show(GrabThread1 & GrabThread2 & GrabThread3 & GrabThread4 & GrabThread5)
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    Das Problem ist nicht gerade ausreichend beschrieben. Wenn es Dir wirklich nur um Zahlen zwischen 1 und 1000000 gehen würde, ließ sich das einfach lösen: Thread 1 nimmt die Zahlen von 1 bis 200000, Thread 2 von 200001 bis 400000, ...
    Man kann das auch mit sowas wie If Zahl Mod 5 = 0 Then ÜbergibDieZahlAnThread1 behandeln oder noch Variablen einbauen, wenn es mehr als 5 Threads sein sollen.
    Aber Deine Logik in Z#37 geht nicht auf. Wenn If GrabThread1 & GrabThread2 & GrabThread3 & GrabThread4 & GrabThread5 = False Then funktionieren würde, indem Du statt & AndAlso nimmst, käme raus, dass die GrabThread1-4 True zurückgeben müssen und GrabThread5 False, damit der weitere Code verarbeitet wird. Denn If GrabThread1 Then ist das gleich wie das redundante If GrabThread1 = True Then
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jou.
    @C.O.D.E Beschreib mal etwas genauer, was in der Thread-Prozedur passieren soll.
    Das sieht mir auch eher nach Parallel.For oder Parallel.ForEach aus.
    Vorteil: Parallel.X nutzt alle Prozessor-Ressourcen, die verfügbar sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @All: Also, ich muss auf meinem Server 1.000.000 abfragen (mit einem WebClient) machen. Deswegen dachte ich es wäre sinnvoll mit Multithreading die arbeit zu zerteilen und so schneller zu sein. Meinem server macht das nichts aus. Ich wür

    Die URL:

    Quellcode

    1. meinserver232.de/1.html


    Diese 1 würde ich dann durch i aus der Schleife ersetzen. -> i = Zahlen von 1 bis 1.000.000
    Dann lade ich mir von der Seite den Quelltext und parse ihn.
    Und anschließen muss ich das Ergebnis in eine Excel schreiben lassen.

    Danke!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Ich habe damit noch nie gearbeitet, hast du ein ganz Simples Beispiel?

    VB.NET-Quellcode

    1. Parallel.For(1, 10000, Sub(Test)
    2. MessageBox.Show("Test")
    3. End Sub)


    Wird diese Sub dann 10000 mal ausgeführt? Ich möchte ungern alle Schleifen Parallel laufen lassen. Da bricht mein PC/Server in die Knie!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „C.O.D.E“ ()

    C.O.D.E schrieb:

    VB.NET-Quellcode

    1. MessageBox.Show("Test")
    nimmt man nicht für einen Parallel.For-Test, schreib einfach den Laufparameter in die Console:

    VB.NET-Quellcode

    1. Sub Test(index As Integer)
    2. Console.WriteLine(index.ToString())
    3. End Sub
    und lass die Schleife im Test nur bis 100 laufen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!