Announcement

Collapse
No announcement yet.

Problem beim Erstellen dynamischer Anzahl von Threads

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim Erstellen dynamischer Anzahl von Threads

    Hallo,

    ich habe ein Problem beim Erstellen von Threads und würde Euch darum um Hilfe bitten. Die Suche Funktion habe ich bereits versucht allerdings habe ich dazu nicht passendes gefunden (sollte jemand den Link zu dem Thema haben wäre ich auch dankbar!).

    Ich verwendet vb.net Express 2008 und möchte gerne über eine ComboBox (welche mit Zahlen gefüllt ist) vorgeben, wieviele Threads gestartet werden sollen, weiter unten im Text der Quellcode dazu. In dem Thread schreibe ich ein Logfile, d.h. wenn ich in der ComboBox 5 ausgewählt habe sollten 5 Threads gestartet werden und jeweils ein Logfile (simultan) erstellt werden.

    Was mich nun irritiert ist, dass ich die Funktion "MsgBox(...)" verwenden muss, da sonst nur ein Thread (nämlich nur der, den ich in der ComboBox auswähle) gestartet wird.

    Ich verstehe also nicht, was für einen Unterschied es macht (codetechnisch) ob man ein MsgBox drin hat oder nicht. Mit MsgBox funktioniert es zwar, aber man darf dann x-Male auf "OK" klicken, was auch nicht elegant ist.
    Ausserdem verfälscht es die Ergebnisse, da die Threads nicht simultan sondern mehr oder minder in sequence gestartet werden.

    Für jede Hilfe die zur Auflösung dieses Falles dienlich ist wäre ich sehr dankbar

    Liebe Grüße
    michi



    Code:
                If Me.chkStartInThreads.Checked Then
                    Dim intMaxThreads As Integer = CInt(cboNumOfThreads.Items(cboNumOfThreads.SelectedIndex))
    
                    Dim trd(intMaxThreads) As Thread
    
                    For iCnt As Integer = 1 To intMaxThreads
                        ' MsgBox required because otherwise only one thread will be started instead of 1 To intMaxThreads threads :(
    
                        MsgBox("Startup thread: " & iCnt.ToString)
    
                        'Number of threads starts with 1 - there is not 0 thread
                        'In vb the array starts with 0 that's the reason of the - 1 ( trd(0) means thread 1 )
    
                        intCurrentThread = iCnt
    
                        Application.DoEvents()
    
                        trd(iCnt - 1) = New Thread(AddressOf StartTestConversion)
                        trd(iCnt - 1).Name = "StartTestConversion" & iCnt.ToString
                        trd(iCnt - 1).IsBackground = True
                        trd(iCnt - 1).Start()
    
                    Next
    
                End If

  • #2
    Woran erkennst du das du nur einen Thread hast? Ich kann im Moment nur vermuten das du die Threads nicht richtig von einander isoliert hast und wenn die gleichzeitig laufen du den Eindruck hast es gäbe nur einen. Durch die künstliche Pause des MessageBox anzeigen (und wegklicken) hast du es vermutlich geschafft das die mehr oder weniger nacheinander laufen und sich nicht gegenseitig stören. Zeig uns auch mal StartTestConversion da wird wahrscheinlich das Problem liegen.

    Comment


    • #3
      Danke für die schnelle Antwort.

      Das habe ich anfangs auch vermutet.

      Den Code kann ich leider nicht posten, da man nur 10.000 Zeichen posten darf und die Prozedur länger ist.

      Sorry, vergas auf die Frage zu Antworten (darum das edit

      Das merke ich daran, dass wenn ich eine MsgBox einbaue x Logfiles geschrieben werden und sonst nur eines und genau das max(x) - wobei x die variable Anzahl der Threads entspricht.


      Danke!
      Zuletzt editiert von m.ranger; 01.06.2011, 17:14.

      Comment


      • #4
        Das merke ich daran, dass wenn ich eine MsgBox einbaue x Logfiles geschrieben werden und sonst nur eines und genau das max(x) - wobei x die variable Anzahl der Threads entspricht.
        Das dachte ich mir. Und ich dachte mir noch woher weiß er das die Threads nicht vielleicht immer in die selbe Logdatei schreiben oder zumindest gegenseitig überschreiben weil beispielsweise bei der Ermittlung des Logfile Namen ein Fehler liegt.

        Den Code kann ich leider nicht posten, da man nur 10.000 Zeichen posten darf und die Prozedur länger ist.
        Wie immer bei solchen Bugs solltest du das Problem(und dessen Code) soweit reduzieren bis man selber über das Problem stößt oder ein so knappes Beispiel hat das das Problem nachstellt das man es jemanden anderen zeigen ohne das dieser aufgrund schierer Größe eh abwinkt.

        Comment


        • #5
          Das verstehe ich natürlich. Danke für den Hinweis, ich werde den Code mal reduzieren und versuche eine Lösung zu finden. Falls ich etwas finde poste ich die Lösung natürlich, falls nicht auch

          Comment


          • #6
            Ich denke ich habe das Problem gefunden. Vermutlich war eine Varialble das Problem, nachdem ich die Sub in eine eigene Class verschoben und den Thread Aufruf angepasst habe hat es funktioniert. Vielleicht hilft es zukünftig den einen oder anderen hier weiter.

            Was mich aber dennoch wundert ist, dass der MsgBox Aufruf eine Auswirkung auf den nachfolgenden Code haben kann, ohne direkt darauf einen Einfluss zu haben (es wurde ja kein Returnwert - Ja/Nein, ... - ausgewertet).


            Code:
            Dim intMaxThreads As Integer = CInt(cboNumOfThreads.Items(cboNumOfThreads.SelectedIndex))
            
            Erase trd
            
            ReDim trd(intMaxThreads - 1)
            
            For iCnt As Integer = 1 To intMaxThreads
            
                intCurrentThread = iCnt
                iValue = Rand.Next(100, 500000)
            
                Dim ThreadConv As New ThreadConversion(Me.ComboBox1.Items(Me.ComboBox1.SelectedIndex), _
                                                       Me.chkStartInThreads.Checked, _
                                                       iCnt, _
                                                       strChannels, _
                                                       Me.chkShowWindow.Checked, _
                                                       Me.chkDeleteFiles.Checked, _
                                                       False, _
                                                       Me.lstBoxQuality, _
                                                       Me.lstBitRange, _
                                                       Me.ConvProgressBar, _
                                                       iValue)
            
            
                'Number of threads starts with 1 - there is not 0 thread
                'In vb the array starts with 0 that's the reason of the - 1 ( trd(0) means thread 1 )
            
                trd(iCnt - 1) = New Thread(AddressOf ThreadConv.StartTestConversion)
                trd(iCnt - 1).Name = "StartTestConversion" & iCnt.ToString
                trd(iCnt - 1).IsBackground = True
                trd(iCnt - 1).Start()
            
            Next

            Comment


            • #7
              Was mich aber dennoch wundert ist, dass der MsgBox Aufruf eine Auswirkung auf den nachfolgenden Code haben kann, ohne direkt darauf einen Einfluss zu haben (es wurde ja kein Returnwert - Ja/Nein, ... - ausgewertet).
              Durch das einziehen der Klasse oder besser gesagt der Instanz einer Klasse hast du für jeden Thread jetzt einen eindeutigen Zustand gesichert der nur im Zugriff dieses einen Threads ist. Vorher waren bestimmte Variablen wahrscheinlich geshared zwischen den Threads.

              Zum Beispiel fällt mir auf das du iCnt übergibst. Wenn du vorher z.B. aus den Threads selbst auf iCnt (über intCurrentThread) zugegriffen hast dann war der Wert im Thread eher zufällig denn der Hauptthread(und damit deine Threaderzeugungsschleife) wird ja weiterlaufen. Es gibt keinen zwingenden Grund das beim Aufruf von Thread.Start () dieser auch sofort losläuft oder lange genug läuft sich diese Informationen zu ziehen bevor der Hauptthread ICnt geändert hat.

              Wenn ich eine 'Fehlertheorie' aufstellen müsste würde ich behaupten alle deine Threads haben den selben Wert für ICnt (nämlich intMaxThreads) gelesen, da bevor eine der Threads richtig angelaufen war die Schleife im Hauptthread schon fertig war. Mit diesem Wert hast du dann ein Logfile Namen ermittelt und alle Threads haben dann in die selbe Datei geschrieben. Durch die MessageBox hast du einen ContextSwitch erzwungen. Heißt die anderen Threads sind auch mal angelaufen und haben sich ihre benötigten Daten rangezogen bevor du die MessageBox weggeklickt hast und damit die Schleife weiter lief.

              Comment

              Working...
              X