메시지를 상태 로그로 사용하여 텍스트 상자를 업데이트하는 방법을 드러내고 싶습니다. AppendText 메서드를 사용하고 싶습니다만, 그것을 사용할 때 이상한 멀티 스레딩 문제가 발생합니다. 연결을 통해 새 메시지를 추가 할 수 있습니다. 이 문제는 텍스트 상자가 표시되지 않는 것처럼 자체를 표시하고 폼을 닫을 때 크로스 스레드 액세스 오류가 표시됩니다.Control.BeginInvoke가 TextBox.AppendText, Cross Threading과 함께 작동하지 않습니다.
작동하지만 추가 단계는 최후의 수단 인 촬영하지 않는에서는 AppendText을 좋아하지 :
Public Sub AddMessage2(ByVal newMessage As String)
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf)
Else
TextBoxStatus.Text = TextBoxStatus.Text & newMessage & ControlChars.CrLf
End If
End Sub
것은 내가 사용하고자하는 어떤하지만 작동하지 않습니다 : 다음의 예는 어떻게 작동하고 어떤 것은하지 않습니다 있습니다
Public Sub AddMessage(ByVal newMessage As String)
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
Else
TextBoxStatus.AppendText(newMessage)
End If
End Sub
추가 정보 및 업데이트 : 우선 내가 충분한 정보를 제공하지 않을 가능성에 대해 사과드립니다. 문제의
적어도 일부 형태의 인스턴스를 다음과 같은 코드가 작동하기 때문에 Show()
를 호출하기 전에 AddMessage(newMessage)
를 호출 할 것 같다
Public Sub AddMessage(ByVal newMessage As String)
If Me.Created Then
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(newMessage))
Else
TextBoxStatus.AppendText(newMessage)
End If
End If
End Sub
나는 항상 다음과 같은 것을 할 수 있지만 무엇을 내가 좋아하는 것 :)
Private backLog As String = ""
Public Sub AddMessage(ByVal newMessage As String)
If Me.Created Then
If TextBoxStatus.InvokeRequired Then
TextBoxStatus.BeginInvoke(Sub() TextBoxStatus.AppendText(backLog & newMessage))
Else
TextBoxStatus.AppendText(backLog & newMessage)
End If
backLog = ""
Else
backLog &= newMessage
End If
End Sub
에가는 것은 또한 내가 로그 크기 제한을 추가 할 특히 ...이 매우 우아하다고 생각하지 않습니다
정상적인 상황에서는 코드가 작동해야한다. 폼의'Sub New' 또는'TextBoxStatus' 핸들이 아직 생성되지 않은 다른 지점에서'AddMessage'를 호출하는 보조 스레드를 시작하고 있습니까? 'If Not TextBoxStatus.IsHandleCreated Then Exit Sub'를'AddMessage'의 첫 번째 문장으로 추가 하시겠습니까? – TnTinMn
@TnTinMn 양식이 아직 표시되지 않았으므로 당신이 옳다고 확신합니다. 사용자가 메뉴에서 열 때까지 양식을 표시하지 않고 양식을 만들고 싶습니다. 내가 어떻게 할 수 있는지 알아 보겠다.하지만 머리 위가 위대하다는 것을 안다면 다시 고마워한다. :) Thanks again – Jon
핸들이 생성되지 않았다면 위의 제안을 건너 뛰어 스레드 오류를 해결했다. ? 그렇다면 핸들이 생성 될 때까지 텍스트를 버퍼링하기위한 해킹을 게시합니다. 그것은 꽤되지 않습니다. – TnTinMn