>  기사  >  백엔드 개발  >  .net 프로그래밍 중 스레드의 Form 컨트롤 사용 시 문제

.net 프로그래밍 중 스레드의 Form 컨트롤 사용 시 문제

巴扎黑
巴扎黑원래의
2016-12-20 14:41:141282검색

VB.net을 작성할 때 스레드의 Form에 있는 ListView 컨트롤의 정보를 변경해야 하는 필요성을 느꼈습니다. 이 작업을 시작했을 때 쉽지 않다는 것을 알았습니다. Microsoft의 프레임워크는 스레드의 양식 컨트롤에 대한 직접 액세스를 권장하지 않기 때문입니다. 이는 UI 프로세스의 정상적인 실행을 변경하기 때문입니다. 이 작업을 수행해야 하는 경우 스레드에서 Invoke 함수 또는 InvokeBegin 함수를 사용해야 합니다. 예는 다음과 같습니다.

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
Dimmythread As Thread
mythread = New Thread(New ThreadStart(AddressOf ThreadFunction) )
mythread.Start()

End Sub

Private Sub ThreadFunction()
Dimmythread As Thread
mythread = New Thread(New ThreadStart(AddressOf DoScanThread))
mythread.Start()
End Sub 'ThreadFunction

Private Sub DoScanThread()
Dim myThreadClassObject As New ScanThreadClass(Me)
myThreadClassObject.run()
End 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(myFormControl1.myDelegate, New Object() {"11", 123})
End Sub

End Class

주목해야 할 주요 사항은 Invoke 호출과 대리인의 정의.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.