ホームページ  >  記事  >  バックエンド開発  >  .net プログラミング中にスレッドでフォームのコントロールを使用する際の問題

.net プログラミング中にスレッドでフォームのコントロールを使用する際の問題

巴扎黑
巴扎黑オリジナル
2016-12-20 14:41:141331ブラウズ

VB.net を書いていたときに、スレッド内の Form 上の ListView コントロールの情報を変更する必要があることがわかりました。 Microsoft のフレームワークでは、スレッド内のフォーム上のコントロールへの直接アクセスが推奨されていないためです。これにより、UI プロセスの通常の実行が変更されるためです。これを行う必要がある場合は、スレッド内で Invoke 関数または InvokeBegin 関数を使用する必要があります。以下に例を示します。

Imports System.Threading

Public Class Form1
Delegate Sub AddListItem(ByVal IPString As String, ByVal ScanPort As Integer)
Public myDelegate As AddListItem
Public OpenPortCount As Integer = 0

Private Sub Form1_Load(ByVal) sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
myDelegate = New AddListItem(AddressOf AddListItemMethod)
End Sub

Private Sub Start_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) ハンドルStart_Button.Click
mythread を Thread として暗くする
mythread = New Thread(New ThreadStart(ThreadFunction))
mythread.Start()

End Sub

Private Sub ThreadFunction()
mythread を Thread として暗くする
mythread = New Thread(New ThreadStart (doscanthread のアドレス)
Mythread.start ()
End sub -privFunction

Private Sub Doscanthread () Lass (Me) yMythreadClassObject.run ()
End Sub

Public Sub addlistITEMMETHOD (byval IPString As String, ByVal scanport As Integer)

ListView_Result.Items.Add(IPString, OpenPortCount) 'ScanIP.ToString(), 0)
ListView_Result.Items(OpenPortCount).SubItems.Add(scanport.ToString())
OpenPortCount + = 1
End Sub 'AddListItemMethod

End Class

Public Class ScanThreadClass

Private myFormControl1 As Form1


Public Sub New(ByVal myForm As Form1)

myFormControl1 = myForm

End Sub 'New

Public Sub run()

myFormControl1.Invoke(myForm Control1.myDelegate , New Object() {"11", 123})
End Sub

End Class

注目すべき点はInvokeの呼び出しとDelegateの定義です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。