for a=0 to 1000
lable.text=a
next
上面的循环不会更新lable的文本状态,而循环正在运行,它仅在for循环结束时更新,但我尝试使用vb6.0,可以使用Do事件。 但我不知道vb2010 beta 2中的功能是什么。 PLZ帮我解决了这个问题。
答案 0 :(得分:1)
答案 1 :(得分:1)
你需要改变你在.NET中思考这类问题的方式 - DoEvents是一个解决VB缺乏线程的黑客,有用但不是一个好的解决方案。
要在保持UI响应的同时运行处理器密集型任务,您需要使用多线程,您可以在单独的线程中启动密集型工作并更新主线程中的UI。
最简单的方法是使用BackgroundWorker类http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(VS.100).aspx
您的循环将引发您的UI代码将用于更新标签的ReportProgress事件。
答案 2 :(得分:1)
您可以在.Net中使用Application.DoEvents()
- 但您可能不应该这样做。它可能导致各种奇怪的行为,这将是调试的噩梦。我已经看到按钮的OnClick事件在禁用按钮时触发(作为示例)并最终将其追溯到调用DoEvents()。
如果您的目标只是计算和更新标签 - 请使用Timer
。
如果你正在做有意义的工作 - 你应该研究多线程。
BackgroundWorker
课程让这很简单 - 您可以让它报告进度并更新您的控件。如果您不使用旧版本的.NET Framework - 您也可以使用Task
。
说完了所有这些 - 无论你采用什么方法 - 你将无法在你的例子中提供的环路中看到很多东西。它只会发生得太快(除非您使用计时器并适当设置Tick值)。
使用计时器的示例 最简单的方法是在表单设计器中 - 将计时器组件(在“组件”组下)拖到表单上。您可以编辑属性并为其指定适当的名称,并将Tick值设置为500(即以毫秒为单位的刻度间隔)。将Enabled值设置为True。
现在单击Timer控件,然后拉出Properties窗口。单击“事件”图标,然后双击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
答案 3 :(得分:0)
你的问题不是很清楚,但我会试着解释一下我的理解。循环实际更新它,但它发生得太快,你只能看到最终值。我不知道sleep()
方法的VB等效,但你应该能够很快在网上找到它。
答案 4 :(得分:0)
它不是文本没有被改变,但是当你每次循环时它被覆盖。如果要在标签中显示0到1000,则必须附加值。