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 で処理するのが最適です。1 つをフォームに配置し、その を設定しWorkerReportsProgress=Trueます。また、ListBox に 100 万個の数字を配置するのはおそらく良い考えではないので、省略しました。

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 がフリーズするのを防ぐには?

これにも良い情報があるかもしれません: Updating UI from another thread

于 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 に答える