2

我有一个案例,我需要生成数百万个唯一代码。为此,我创建了一个生成函数,其中生成随机数。我从 for 循环调用此函数并将生成的数字添加到列表框中。我的代码如下

  for i=1 to val(txtnumber.txt)
       mynum=generate()
  next

我在表单上创建了一个标签,我想在其中显示处理循环时经过的秒数。我使用定时器控制作为

     timer1.start()
     for i=1 to val(txtnumber.text)
        mynum=generate()
        listbox1.items.add(mynum)
     next
     timer1.stop

和 timer1_tick 功能

     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Label1.Text = Val(Label1.Text) + 1
     End Sub

但是当我单击生成按钮时,会生成所有数字,但计时器不显示经过的时间。

我可能错过了一些东西,所以请帮帮我

4

3 回答 3

3

这可能最好在 BackgroundWorker 中处理。将一个放在表单上并设置其WorkerReportsProgress=True. 此外,在 ListBox 中放置一百万个数字可能不是一个好主意,所以我省略了这一点。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Button1.Enabled = False
  BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  Dim started As DateTime = Now
  For i As Integer = 1 To val(txtnumber.txt)
    mynum=generate()
    BackgroundWorker1.ReportProgress(i, Nothing)
  Next
  Dim ended As TimeSpan = Now.Subtract(started)
  BackgroundWorker1.ReportProgress(0, ended.TotalSeconds.ToString)
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
  If e.UserState IsNot Nothing Then
    Label1.Text = e.UserState.ToString()
  Else
    Label1.Text = e.ProgressPercentage.ToString
  End If
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
  Button1.Enabled = True
End Sub

ProgressChanged当工作人员报告事件时,您的标签应该会正确更新。

于 2012-07-17T16:58:05.570 回答
1

您遇到的是线程问题。您为生成数字所做的工作正在由 UI 线程执行,因此它永远没有机会更新屏幕。看看这里: 如何防止 UI 在漫长的过程中冻结?

这也可能对您有很好的信息: 从另一个线程更新 UI

于 2012-07-17T16:39:12.760 回答
0

试试这个:

Private _Counter As Integer = 0
Private _StartTime As Date = Now

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    _StartTime = Now
    _Counter = CInt(Val(txtnumber.Text))
    ListBox1.Items.Clear()
    Label1.Text = "0"
    Timer1.Interval = 50
    Timer1.Start()
End Sub

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    ListBox1.Items.Add(generate())
    Label1.Text = New Date((Now - _StartTime).Ticks).ToString("HH:mm:ss.ff")
    _Counter -= 1
    If (_Counter <= 0) Then
        Timer1.Stop()
    End If
End Sub

或者您可以研究实际的Threading

于 2012-07-17T16:44:20.617 回答