私は一連のpingターゲットを持つpingプログラムに取り組んでおり、それぞれが独自のスレッドを生成してpingを実行し、UIスレッドの速度が低下するのを防ぎます。
ユーザーが ping ターゲットのプロパティを編集して、スレッドがスリープする時間でもある ping 間の時間 (頻度) を変更すると、更新されたスリープ時間で新しいスレッドが作成され、元のスレッドは続行されますが、結果は 2 です。スレッドはさまざまなタイミングで同じコンピューターに ping を送信します。そのため、更新されたパラメーターで新しいスレッドを開始する前に、元のスレッドを終了する必要があります。
'Set up a class as a ping object, it will store information necessary (not sure entirely how this works)
Class pingObj
Property Name As String
Property IP As String
Property Frequency As String
Property TimeOut As String
End Class
'Main ping sub, starts the threads to ping on!
Public Sub Ping(Name As String)
Dim Parameters As New pingObj
Parameters.Name = Name
Parameters.IP = Targets(Name)(0)
Parameters.Frequency = Targets(Name)(1)
Parameters.TimeOut = Targets(Name)(2)
Dim thread As New Threading.Thread(AddressOf PingThread)
thread.IsBackground = True
thread.Start(Parameters)
End Sub
'The thread itself, pings each system to determine if it is offline or online.
Public Sub PingThread(p As Object)
Dim Parameters As pingObj = DirectCast(p, pingObj)
'Do stuff
Do
If Targets.ContainsKey(Parameters.Name) Then
'Lots of ping code'
'Delay based on the frequency set.
Dim TimeInMS As Integer = TimeSpan.Parse(Parameters.Frequency).TotalMilliseconds
Threading.Thread.Sleep(TimeInMS)
Else
Exit Do
End If
Loop
End Sub
基本的に、上記では、Ping(Name) でスレッドを開始し、辞書から ping ターゲットに関するデータを収集し、オブジェクト (pingobj) を使用してそのデータを PingThread() サブルーチンに押し込みます。現在、ターゲットがディクショナリから削除されると、「if targets.containskey(parameters.name)」はそれがなくなったことをキャッチし、「Exit Do」を実行します。これにより、スレッドの機能が十分長く停止し、自動的にそれ自体が中止されます。
The thread '<No Name>' (0x2314) has exited with code 0 (0x0).
ただし、ユーザーがターゲットのプロパティを編集し、頻度 (スレッドがスリープする時間) を変更すると、元のスレッドを強制的に中止し、新しいパラメーターで新しいスレッドを開始する必要があります。ユーザーが定義したよりも頻繁に同じターゲットに ping を実行する 2 つのスレッド。
難しいのは、スレッドが ping() サブルーチンでオンザフライで作成され、スレッドがどこにも保存されないことです。そのため、必要なときに単に thread.abort() を呼び出すことはできません。スレッドのサブ PingThread() 内からスレッドを中止することしかできません。
TL;DR: ユーザーがスレッドのスリープ時間を変更したために、オンザフライで作成され、保存されていないスレッドを中止する方法が必要です。
PS なぜ大文字の t を入力できないのですか? それを使用するには、1つをコピーして貼り付ける必要があります。