VB.net Cross-Thread - PullRequest
       13

VB.net Cross-Thread

0 голосов
/ 10 февраля 2010

У меня есть команда cmd, которую нужно выполнить, когда команда запускается, она начинает заполнять индикатор выполнения. Когда команда cmd выполнена, индикатор выполнения должен заполниться до 100.

Это код, который я использую, но он выдает ошибку при появлении progressbar.Value = 100.

Public Class Form1
    Dim teller As Integer

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick
    teller += 1
    ProgressBar1.Value = teller

    If ProgressBar1.Value = ProgressBar1.Maximum Then
        TimerProgressbar.Stop()
    End If
End Sub

Это команды буксировки в другом частном подразделе, где происходит сбой приложения

ProgressBar1.Value = 100
    TimerProgressbar.Stop()

Когда я отлаживаю и пробую, он падает на

ProgressBar1.Value = 100

Но когда я собираю его под Windows 7, он работает нормально, без сбоев, однако несколько человек сообщили мне, что он зависает в системе Windows XP.

В.Б. дает мне советы по поводу Cross Thread, но я не знаю, как мне с этим справиться.

1 Ответ

0 голосов
/ 23 мая 2010

Вы можете получить доступ (за одним исключением) к свойствам и методам Окна (или чего-либо связанного с Окном) только из потока, создавшего это Окно.

Но WinForms включает в себя поддержку этого с помощью методов InvokeBeginInvoke) для выполнения перекрестного вызова со свойством InvokeRequired.

Если InvokeRequired имеет значение true, тогда вам нужно использовать Invoke для перекрестных потоков. Для этого оберните ваш код, который управляет элементом управления в своем собственном методе, и вызовите его напрямую или через Invoke. (Для выполнения операции асинхронно кросс-потоки используйте BeginInvoke.) Что-то вроде:

Private Sub IncrementProgress()
    teller += 1
    ProgressBar1.Value = teller

    If ProgressBar1.Value = ProgressBar1.Maximum Then
        TimerProgressbar.Stop()
    End If
End Sub      

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick
  if ProgressBar1.RequiredInvoke Then
    ProgressBar1.Invoke(IncrementProgress)
  Else
    IncrementProgress
  End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...