что такое функция, которую я могу использовать вместо событий Do (используется в vb6.0) в (vb2010) - PullRequest
0 голосов
/ 27 января 2010
for a=0 to 1000
lable.text=a
next
Цикл

выше не обновляет текстовое состояние lable, в то время как цикл работает, он обновляется только в конце цикла for, но я пробовал с vb6.0 это возможно с помощью событий Do но я не знаю, какова функция в vb2010 бета 2. Пожалуйста, помогите мне решить эту проблему.

Ответы [ 5 ]

1 голос
/ 13 мая 2012

Вы можете использовать Application.DoEvents() в .Net - но вам, вероятно, не следует. Это может вызвать все виды странного поведения, которое будет кошмаром для отладки. Я видел, как срабатывает событие OnClick кнопки, когда кнопка отключена (в качестве примера), и, в конечном счете, проследило ее до вызова DoEvents ().

Если ваша цель - просто посчитать и обновить метку - используйте Timer.

Если вы делаете значимую работу - вам следует заняться многопоточностью.

Класс BackgroundWorker делает это чертовски простым - вы можете сделать так, чтобы он сообщал о прогрессе и обновлял ваш контроль. Если вы не используете старую версию .NET Framework - вы также можете использовать Task.

Сказав все это - независимо от того, какой подход вы выберете, - вы не сможете увидеть что-то внутри цикла, как вы показали в своем примере. Это просто произойдет слишком быстро (если вы не используете таймер и не установите соответствующее значение Tick).

Пример использования таймера Самый простой способ сделать это - в конструкторе форм - перетащить компонент Timer (в группе «Компоненты») на форму. Вы можете отредактировать свойства и дать ему соответствующее имя и установить значение Tick примерно на 500 (это интервал между тиками в миллисекундах). Установите для параметра «Разрешено» значение «Истина».

Теперь щелкните элемент управления Timer и откройте окно свойств. Нажмите на значок событий и дважды щелкните текстовое поле Tick. Это должно создать обработчик по умолчанию для вас.

Измените код так, чтобы он выглядел следующим образом:

Private A As Integer

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    ' Update the text
    Label1.Text = A.ToString
    A += 1

    ' Stop the timer 
    If A >= 1000 Then
        Timer1.Enabled = False
    End If
End Sub
1 голос
/ 27 января 2010

Вам нужно изменить способ, которым вы думаете об этой проблеме в .NET - DoEvents был хаком, чтобы справиться с отсутствием потоков в VB, полезным, но не хорошим решением.

Чтобы выполнить задачу с интенсивным использованием процессора, сохраняя при этом отзывчивый интерфейс, необходимо использовать многопоточность, вы запускаете интенсивную работу в отдельном потоке и обновляете интерфейс в основном потоке.

Самый простой способ сделать это - использовать класс BackgroundWorker http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(VS.100).aspx

Ваш цикл вызовет события ReportProgress, которые ваш код пользовательского интерфейса будет использовать для обновления метки.

1 голос
/ 27 января 2010

Вы можете попробовать

Application.DoEvents ()

Или даже

lable.Refresh ()

0 голосов
/ 27 января 2010

Его текст не меняется, а перезаписывается при каждом цикле. Если вы хотите отобразить от 0 до 1000 в метке, вам нужно добавить значение.

0 голосов
/ 27 января 2010

Ваш вопрос не очень понятен, но я постараюсь объяснить, что я понял. Цикл на самом деле обновляет его, но это происходит так быстро, что вы видите только конечное значение. Я не знаю VB-эквивалент метода sleep(), но вы сможете найти его в сети довольно быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...