vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Klasse für MultiThreading 
Autor: Schü
Datum: 06.08.10 14:16

Hallo Leute!

Brauche mal Eure kompetente Hilfe.

Ich habe mir eine Basis-Klasse für Multithreading Arbeiten erstellt, die folgendes machen sollte:

- Klasse läuft als seperater Thread
- nimmt eine beliebige Anzahl an Objekten in einer Liste auf
- startet die Verarbeitung der einzelnen Objekte nach verfügbarer freier Rechenleistung
- verteilt die Arbeiten wiederum auf weitere Threads, je nach Vorgabe oder Anzahl
der Prozessorenkerne (parallel???)
- gibt Ereignisse zur Fertigstellung der Arbeiten an oder sammelt die Ergebnisse
in einer Ausgabeliste

Einigen Code (z.B. das mit OnEvent()) habe ich aus diversen Foren oder Beispielprojekten, welche ich versucht habe zu verstehen und zu erweitern. Nachdem ich nun die ersten Testläufe duchgeführt habe, das Thema Threading aber für mich absolut neu ist, habe ich Angst, irgendwo im Detail Fehler gemacht zu haben, weil ich nicht ganz im Detail durchsteige.

Ich hoffe Ihr könntet Euch das mal anschauen wo da die Säge klemmen könnte. Ich bin dankbar für jede Meinung und Kritik.

Schü

Hier mein Code: (habe absichtlich auf Imports-Anweisungen verzichtet)
Ich teile den Code auf und schiebe einen Teil in die 1. Antwort (Begrenzug des Beitrags auf 5kB)

Module mThreading
    ''' <summary>
    ''' Klasse zum Kpseln diverser Multithreading-Aufgaben
    ''' Erstellt von Jörg Schützner im August 2010
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <remarks></remarks>
    Public MustInherit Class MultiTaskProcessor(Of T)
        Inherits ThreadWrapperBase
 
        Public Event Completed As EventHandler(Of MTP_ThreadEventArgs)
        Public Event Paused As EventHandler(Of MTP_ThreadEventArgs)
        Public Event Continued As EventHandler(Of MTP_ThreadEventArgs)
        Public Event Abborted As EventHandler(Of MTP_ThreadEventArgs)
        Public Event AbbortRequested As EventHandler(Of MTP_ThreadEventArgs)
        Public Event Started As EventHandler(Of MTP_ThreadEventArgs)
 
        Public Event SingleTaskCompleted As EventHandler(Of MTP_ThreadEventArgs)
        Public Event SingleTaskStarted As EventHandler(Of MTP_ThreadEventArgs)
        Public Event SingleTaskAbborted As EventHandler(Of MTP_ThreadEventArgs)
 
        Protected MustOverride Sub DoWork(ByVal Obj As T)
 
        Protected mPauseWaitHandle As New System.Threading.ManualResetEvent( _
          True)
        Protected mInputListeWaitHandle As New _
        System.Threading.ManualResetEvent(True)
 
        Protected mPaused As Boolean = True
        Protected mListClose As Boolean
 
        'Listen...
        Protected mInputList As New Queue(Of T)
        Protected mOutputList As New Queue(Of T)
        Protected mErrorList As New Queue(Of T)
 
        Protected mWorkTime As TimeSpan = TimeSpan.Zero
        Protected mStartTick As Date
        Protected mUseOutputList As Boolean = False
        Protected mInputListWaitTimeout As Integer = 500
        Protected mOutputListWaitTimeout As Integer
        Protected mCPU_Count As Integer
        Protected mAnzTasks As Integer
        Protected mStartTimeout As Integer
        Protected mMaxTaskCount As Integer
        Protected mStartRequested As Boolean = False
        Protected mNoDoubleItems As Boolean 'Keine Doubletten in der Inputliste 
        ' zulassen
 
        Private mSingleThreads As New List(Of SingleTaskProcessor)
 
        'TODO: OutputListe integrieren
        'TODO: reine Rechenzeit ermitteln
        'TODO: Ermöglichen, das die Reihenfolge der Eingabe auch Reihenfolge 
        ' der Ausgabe ist, falls gewünscht
 
 
        Protected Sub OnEvent(ByVal Sender As Object, ByVal e As EventArgs, _
          ByVal [Event] As System.Delegate)
            Dim Fired As Boolean = False
            If [Event] IsNot Nothing Then
                For Each singlecast As System.Delegate In _
                  [Event].GetInvocationList
                    Fired = False
                    Try
                        Dim syncInvoke As _
                          System.ComponentModel.ISynchronizeInvoke = CType( _
                          singlecast.Target, _
                          System.ComponentModel.ISynchronizeInvoke)
                        If syncInvoke IsNot Nothing AndAlso _
                        syncInvoke.InvokeRequired Then
                            Fired = True
                            syncInvoke.Invoke(singlecast, New Object() {Sender, _
                              e})
                        Else
                            Fired = True
                            singlecast.DynamicInvoke(New Object() {Sender, e})
                        End If
                    Catch ex As System.Reflection.TargetInvocationException
                        If Not Fired Then
                            singlecast.DynamicInvoke(New Object() {Sender, e})
                        End If
                    End Try
                Next
            End If
        End Sub
 
'...... Hier komt dann der Rest........
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Klasse für MultiThreading2.503Schü06.08.10 14:16
Re: Klasse für MultiThreading1.738Schü06.08.10 14:19
Re: Klasse für MultiThreading1.788ModeratorDaveS06.08.10 14:50
Re: Klasse für MultiThreading2.042Schü06.08.10 15:34
... Code ...1.888Schü06.08.10 15:48
... Code ...1.760Schü06.08.10 15:49
... Code ...1.871Schü06.08.10 15:51
... Code ...1.734Schü06.08.10 15:51
... Code ...1.808Schü06.08.10 15:52
... Code ...1.851Schü06.08.10 15:52
... Code ...1.761Schü06.08.10 15:53
... Code ...1.832Schü06.08.10 15:54
... Code ...1.697Schü06.08.10 15:56
... Code ... Ende1.782Schü06.08.10 15:57
Re: Klasse für MultiThreading1.754ModeratorRalfE06.08.10 19:17
Re: Klasse für MultiThreading1.729Schü07.08.10 15:35
Re: Klasse für MultiThreading1.735ModeratorDaveS07.08.10 16:04
Re: Klasse für MultiThreading1.801ModeratorRalfE07.08.10 16:33
Re: Klasse für MultiThreading1.729Schü07.08.10 17:17
Link zum Projekt2.003Schü09.08.10 11:30
1. Korrektur1.712Schü10.08.10 07:55
2. Korrektur1.729Schü10.08.10 08:26
3. Korrektur1.721Schü11.08.10 09:49

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel