kruemel666
Goto Top

Multithreading in VB 2005

Hallo zusammen,

folgendes Problem, ich bin dabei mir ein Programm zu schreiben das von Clients den Stauts bestimmter Dienste abruft. Da es sich um eine Größere anzahl von Clients handelt will ich das ganze über Multithreading lösen. Ich hab nun ein Form mit den Steuerlementen und einem Button der mir einen Threadpool initialisiert. Der Threadpool greift auf eine Sub in einer extra Klasse zu die mir den Status pollt. Das ganze funktioniert soweit ganz gut. Nun hab ich das Problem wie ich die Hosts mit fehlerhaften Diensten in die Listbox aus Form1 eingetragen bekomme...

Hab jetzt schon ne Weile gegoogelt und rausgefunden das ich wohl einen Deleganten brauche und auf das Steuerelement über die Invoke Methode zugreifen kann. Ich bin aber noch relativ neu in VB und steh auf Deutsch gesagt ziemlich auf da Leitung wie das Teil funktioniert.

Hier mal mein Code zur veranschaulichung:

FORM1.vb*
Public Delegate Sub AddCallback(ByVal items() As Object)

Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Me.ProgressBar1.Value = 0
        Dim domain As DirectoryEntry = New DirectoryEntry("LDAP://DOMAINSTRING")  
        Dim errorlevel = 0
        Dim hostcount As Integer
        Dim ready As AutoResetEvent = New AutoResetEvent(False)
        For Each child As DirectoryEntry In domain.Children
            hostcount = hostcount + 1
        Next
        Me.ProgressBar1.Maximum = hostcount
        Dim workerthreads, CompletionPortThreads As Integer
        'Dim hostarbeit As Integer  
        For Each child As DirectoryEntry In domain.Children
            If child.Name Like "CN=HOSTNAME" Then  
                Dim hostname = Mid(child.Name, 4)
                Debug.Print("Beginne mit host: " & hostname)  
                Dim abfrage As New dataquery(hostname)
                Debug.Print("Übergebe hostname an query: " & hostname)  
                ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf abfrage.servicequery), ready)
                      End If
        Next
              MsgBox("fertig main")  
    End Sub

*CLASS1.vb
Imports System.Management
Imports System.Net
Imports System.Net.NetworkInformation
Public Class dataquery

    Private _hostname As String

    Public ReadOnly Property Hostname() As String
        Get
            Return _hostname
        End Get
    End Property

    Public Sub New(ByVal hostname As String)
        Me._hostname = hostname
    End Sub

    Public Sub servicequery(ByVal obj As Object)
        Dim pingsender As New Ping()
        Dim strcomputer As String
        strcomputer = _hostname
        On Error Resume Next
        Dim pingreply = pingsender.Send(strcomputer)
        If pingreply.status = IPStatus.Success Then
            If Err.Number <> 0 Then
                Debug.Print("Hostname unbekannt: " & _hostname)  
                Exit Sub
            End If
            Debug.Print("Host ist Online: " & _hostname)  
            Dim errorlevel = 0
            Dim mos As ManagementObjectSearcher
            Dim moc As ManagementObjectCollection
            Dim mic As ManagementScope
            Dim mo As ManagementObject
            Dim pd As PropertyData
            Dim myConnectionOptions As New System.Management.ConnectionOptions
            With myConnectionOptions
                .Impersonation = System.Management.ImpersonationLevel.Impersonate
                .Authentication = System.Management.AuthenticationLevel.Packet
            End With

            Dim myManagementScope As System.Management.ManagementScope
            myManagementScope = New System.Management.ManagementScope("\\" & strcomputer.ToString & "\root\cimv2", myConnectionOptions)  
            myManagementScope.Connect()
            If myManagementScope.IsConnected = False Then
            End If
            Debug.Print("Beginne mit Servicequery: " & _hostname)  
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'wuauserv'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'Intel Targeted Multicast'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'CBA8'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'Softmon'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ISSUSER'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ntrtscan'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'tmlisten'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'lanmanserver'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ofcpfwSvc'")  
            moc = mos.Get()
            For Each mo In moc
                For Each pd In mo.Properties
                    If pd.Value <> "Running" Then  
                        errorlevel += 1
                    End If
                Next
            Next
            If errorlevel >= 0 Then
                Debug.Print(errorlevel & " Dienste laufen nicht auf " & _hostname)  
                Dim i As New List(Of String)
                i.Add(_hostname)
                If Form1.ListBox1.InvokeRequired Then
                    Form1.ListBox1.Invoke(New Form1.AddCallback(AddressOf Form1.ListBox1.Items.AddRange), New Object() {i.ToArray})
                Else
                    Form1.ListBox1.Items.Add(_hostname)
                End If
            End If
            Else
                Exit Sub
            End If
            obj.set()
    End Sub

End Class


Das ganze funktioniert allerdings wird kein Eintrag in die Listbox hinzugefügt.
Des weiteren wäre es ganz gut wenn ich ein Wait auf den Threadpool setzen könnte damit die Meldung "fertig" erst kommt wenn alle Clients gepollt sind.

Schonmal vielen Dank

LG
Phil

Content-ID: 102586

Url: https://administrator.de/contentid/102586

Ausgedruckt am: 23.11.2024 um 01:11 Uhr