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*
*CLASS1.vb
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 102586
Url: https://administrator.de/contentid/102586
Ausgedruckt am: 23.11.2024 um 01:11 Uhr