내 문제가 익숙 할 것 같은데, 내 프로그램에서 처리중인 데이터와 함께 진행률 표시 줄을 동시에 업데이트하고 싶습니다.진행률 표시 줄 업데이트 WPF 비주얼 스튜디오
저는 두 개의 창이 있습니다 : StartupWindow와 UpdateWindow. 응용 프로그램은 시작 창을 만들어서 시작합니다. 사용자는 UpdateWindow를 여는 버튼을 누를 것입니다.
Private Sub btnUpdateClick(sender As Object, e As RoutedEventArgs) Handles btnUpdate.Click
Dim updateWindow As New UpdateWindow
updateWindow.ShowDialog()
btnUpdate.IsEnabled = False
End Sub
나는 대부분의 다른 사람들이하는 오류가있어이 코드 : 다음은 버튼의 코드입니다. "다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수"
Private Sub updateDevice()
Dim currPercent As Integer
currPercent = ((sentPackets/totalPacketsToWrite) * 100)
progressLabel.content = currPercent.ToString + "%"
pb.Maximum = totalPacketsToWrite
pb.Value = sentPackets
If sentPackets < totalPacketsToWrite Then
'....update....
Else
MsgBox("Device now has update stored on flash!")
'...close everything up
End If
End Sub
- 를 사용하여 호출/디스패처/위임은 다른 스레드의에 업데이트를 넣을 수 시도하고 다워 : 여기
는 지금까지 시도했던 세 가지입니다 대기열에요? 다른 스레드가 UI를 업데이트하기 위해 다른 스레드를 잠시 멈춘 것처럼 보일 수 없습니다.
- BackgroundWorker 클래스를 구현하고 그로부터 보고서 진행률을 사용하면 작동하지만 진행률 막대는
bw.DoWork
아래로 업데이트 할 수 있습니다. 외부 장치에서 응답을 받으면 모든 코드를 하나의 기능으로 묶는 것이 어려울 것입니다. - 두 번째 창 (원본에서 호출 됨)이 작성되었으므로이 문제가 발생했습니다. 그래서 나는 다른 사람의 솔루션을 가져다가 '갱신'버튼을 유의해야 할
뭔가 내가 '취소'버튼을 추가 한 것입니다 예 : 누를 때 완전히 새로운 스레드를 생성하려고 :
Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click
btnStart.IsEnabled = False
btnStart.Visibility = Windows.Visibility.Hidden
btnCancel.IsEnabled = True
btnCancel.Visibility = Windows.Visibility.Visible
beginUpdate()
End Sub
Private Sub buttonCancel_Click(sender As Object, e As RoutedEventArgs) Handles btnCancel.Click
btnStart.IsEnabled = True
btnStart.Visibility = Windows.Visibility.Visible
btnCancel.IsEnabled = False
btnCancel.Visibility = Windows.Visibility.Hidden
'TODO MAKE IT CANCEL
End Sub
을 그리고 업데이트/취소 버튼을 클릭 할 때마다 진행 막대가 업데이트됩니다. 버튼을 누를 때마다 현재 진행률 표시 줄이 새로 고쳐집니다. 나는 아주 당황 스럽다. 단지 하나의 창이면 사용자 인터페이스를 업데이트 할 수 있지만 ... 사용자가 새 창을 호출하는 버튼을 누르면 두 번째 창에서 아무 것도 업데이트 할 수 없다. 어떤 제안?
편집 : 필자는 긴 코드에서 업데이트 된 전역 변수를 만들었습니다. 나는 다른 어떤 짓을하기 전에 이상이있는 BackgroundWorker를 실행하며 진행 표시 줄을 업데이트 내 프로세스에 비동기 실행 : 내 코드의
Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
While finished = False
Threading.Thread.Sleep(50)
bw.ReportProgress(currPercent)
End While
End Sub
시작은 간단했다 -과 같이 :
Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click
bw.RunWorkerAsync()
beginUpdate()
End Sub
안녕하세요, 귀하의 회신과 귀하의 링크에 감사 드리며, 저를 도왔습니다.전역 변수에 백분율을 적용하고 코드 시작시 배경 작업자를 실행했습니다. DoWork 메서드는 내 게시물의 맨 아래에서 편집됩니다. 꽤 간단했지만 효과적이었습니다! 다시 올바른 방향으로 나를 가리켜 주셔서 감사합니다. – JumpingRock
당신을 진심으로 환영합니다. 언제나처럼 ... 비트 단위로 개발하면 복잡한 상황을 단순화합니다. – Sheridan