Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Multithreading in VB 2005

Frage Entwicklung VB for Applications

Mitglied: kruemel666

kruemel666 (Level 1) - Jetzt verbinden

25.11.2008 um 08:08 Uhr, 1996 Aufrufe

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*
01.
Public Delegate Sub AddCallback(ByVal items() As Object) 
02.
 
03.
Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
04.
        Me.ProgressBar1.Value = 0 
05.
        Dim domain As DirectoryEntry = New DirectoryEntry("LDAP://DOMAINSTRING") 
06.
        Dim errorlevel = 0 
07.
        Dim hostcount As Integer 
08.
        Dim ready As AutoResetEvent = New AutoResetEvent(False) 
09.
        For Each child As DirectoryEntry In domain.Children 
10.
            hostcount = hostcount + 1 
11.
        Next 
12.
        Me.ProgressBar1.Maximum = hostcount 
13.
        Dim workerthreads, CompletionPortThreads As Integer 
14.
        'Dim hostarbeit As Integer 
15.
        For Each child As DirectoryEntry In domain.Children 
16.
            If child.Name Like "CN=HOSTNAME" Then 
17.
                Dim hostname = Mid(child.Name, 4) 
18.
                Debug.Print("Beginne mit host: " & hostname) 
19.
                Dim abfrage As New dataquery(hostname) 
20.
                Debug.Print("Übergebe hostname an query: " & hostname) 
21.
                ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf abfrage.servicequery), ready) 
22.
                      End If 
23.
        Next 
24.
              MsgBox("fertig main") 
25.
    End Sub
*CLASS1.vb
01.
Imports System.Management 
02.
Imports System.Net 
03.
Imports System.Net.NetworkInformation 
04.
Public Class dataquery 
05.
 
06.
    Private _hostname As String 
07.
 
08.
    Public ReadOnly Property Hostname() As String 
09.
        Get 
10.
            Return _hostname 
11.
        End Get 
12.
    End Property 
13.
 
14.
    Public Sub New(ByVal hostname As String) 
15.
        Me._hostname = hostname 
16.
    End Sub 
17.
 
18.
    Public Sub servicequery(ByVal obj As Object) 
19.
        Dim pingsender As New Ping() 
20.
        Dim strcomputer As String 
21.
        strcomputer = _hostname 
22.
        On Error Resume Next 
23.
        Dim pingreply = pingsender.Send(strcomputer) 
24.
        If pingreply.status = IPStatus.Success Then 
25.
            If Err.Number <> 0 Then 
26.
                Debug.Print("Hostname unbekannt: " & _hostname) 
27.
                Exit Sub 
28.
            End If 
29.
            Debug.Print("Host ist Online: " & _hostname) 
30.
            Dim errorlevel = 0 
31.
            Dim mos As ManagementObjectSearcher 
32.
            Dim moc As ManagementObjectCollection 
33.
            Dim mic As ManagementScope 
34.
            Dim mo As ManagementObject 
35.
            Dim pd As PropertyData 
36.
            Dim myConnectionOptions As New System.Management.ConnectionOptions 
37.
            With myConnectionOptions 
38.
                .Impersonation = System.Management.ImpersonationLevel.Impersonate 
39.
                .Authentication = System.Management.AuthenticationLevel.Packet 
40.
            End With 
41.
 
42.
            Dim myManagementScope As System.Management.ManagementScope 
43.
            myManagementScope = New System.Management.ManagementScope("\\" & strcomputer.ToString & "\root\cimv2", myConnectionOptions) 
44.
            myManagementScope.Connect() 
45.
            If myManagementScope.IsConnected = False Then 
46.
            End If 
47.
            Debug.Print("Beginne mit Servicequery: " & _hostname) 
48.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'wuauserv'") 
49.
            moc = mos.Get() 
50.
            For Each mo In moc 
51.
                For Each pd In mo.Properties 
52.
                    If pd.Value <> "Running" Then 
53.
                        errorlevel += 1 
54.
                    End If 
55.
                Next 
56.
            Next 
57.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'Intel Targeted Multicast'") 
58.
            moc = mos.Get() 
59.
            For Each mo In moc 
60.
                For Each pd In mo.Properties 
61.
                    If pd.Value <> "Running" Then 
62.
                        errorlevel += 1 
63.
                    End If 
64.
                Next 
65.
            Next 
66.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'CBA8'") 
67.
            moc = mos.Get() 
68.
            For Each mo In moc 
69.
                For Each pd In mo.Properties 
70.
                    If pd.Value <> "Running" Then 
71.
                        errorlevel += 1 
72.
                    End If 
73.
                Next 
74.
            Next 
75.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'Softmon'") 
76.
            moc = mos.Get() 
77.
            For Each mo In moc 
78.
                For Each pd In mo.Properties 
79.
                    If pd.Value <> "Running" Then 
80.
                        errorlevel += 1 
81.
                    End If 
82.
                Next 
83.
            Next 
84.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ISSUSER'") 
85.
            moc = mos.Get() 
86.
            For Each mo In moc 
87.
                For Each pd In mo.Properties 
88.
                    If pd.Value <> "Running" Then 
89.
                        errorlevel += 1 
90.
                    End If 
91.
                Next 
92.
            Next 
93.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ntrtscan'") 
94.
            moc = mos.Get() 
95.
            For Each mo In moc 
96.
                For Each pd In mo.Properties 
97.
                    If pd.Value <> "Running" Then 
98.
                        errorlevel += 1 
99.
                    End If 
100.
                Next 
101.
            Next 
102.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'tmlisten'") 
103.
            moc = mos.Get() 
104.
            For Each mo In moc 
105.
                For Each pd In mo.Properties 
106.
                    If pd.Value <> "Running" Then 
107.
                        errorlevel += 1 
108.
                    End If 
109.
                Next 
110.
            Next 
111.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'lanmanserver'") 
112.
            moc = mos.Get() 
113.
            For Each mo In moc 
114.
                For Each pd In mo.Properties 
115.
                    If pd.Value <> "Running" Then 
116.
                        errorlevel += 1 
117.
                    End If 
118.
                Next 
119.
            Next 
120.
            mos = New ManagementObjectSearcher(myManagementScope.Path.ToString, "Select State from Win32_Service where name = 'ofcpfwSvc'") 
121.
            moc = mos.Get() 
122.
            For Each mo In moc 
123.
                For Each pd In mo.Properties 
124.
                    If pd.Value <> "Running" Then 
125.
                        errorlevel += 1 
126.
                    End If 
127.
                Next 
128.
            Next 
129.
            If errorlevel >= 0 Then 
130.
                Debug.Print(errorlevel & " Dienste laufen nicht auf " & _hostname) 
131.
                Dim i As New List(Of String) 
132.
                i.Add(_hostname) 
133.
                If Form1.ListBox1.InvokeRequired Then 
134.
                    Form1.ListBox1.Invoke(New Form1.AddCallback(AddressOf Form1.ListBox1.Items.AddRange), New Object() {i.ToArray}) 
135.
                Else 
136.
                    Form1.ListBox1.Items.Add(_hostname) 
137.
                End If 
138.
            End If 
139.
            Else 
140.
                Exit Sub 
141.
            End If 
142.
            obj.set() 
143.
    End Sub 
144.
 
145.
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
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (22)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...