【问题标题】:VB.NET Progress Bar issueVB.NET 进度条问题
【发布时间】:2014-07-19 16:52:35
【问题描述】:

我希望在单击按钮时打开另一个带有进度条的表单。到目前为止,执行冻结了几秒钟,然后进度条表单打开,进度条已满,然后关闭。我希望主窗体暂停执行,以便在进度条完成操作之前不会写入文件。这是我的代码:

主类:

Private Sub btnWriteFile_Click(sender As Object, e As EventArgs) Handles btnWriteFile.Click
    If hasUserEnteredFileName() = True Then 'don't worry about this
        If reversedString IsNot Nothing Then 'or this
            FileWriting.Show() 'the progress bar class
            Dim sw As StreamWriter = File.CreateText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & fileName.Text & ".txt")
            sw.Write(reversedString)
            sw.Flush()
            sw.Close()
        End If
    End If
End Sub

进度条类:

Private Sub FileWriting_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ProgressBar1.Minimum = 1
    ProgressBar1.Maximum = 100
    For i = ProgressBar1.Minimum To ProgressBar1.Maximum - 2
        Sleep(10)
        ProgressBar1.Value += 2
        ProgressBar1.Value -= 1
    Next i
End Sub

【问题讨论】:

  • 您的进度条确实显示了任何事情的进度。删除 Sleep 语句,它没有理由存在。写一行文字的进度当然不用汇报
  • 我知道它实际上并没有做任何事情,它只是一个美学特征。
  • 在 MSDN 中用于 Form.Load 在第一次显示表单之前发生。其中的一部分您的代码无法在文件显示时显示进度状态写好了,这两个操作依次执行
  • 为什么无所事事的进度条一定要换新的形式?把它放在当前表单上,让它在那里什么都不做。
  • 别费心回复,你没有解决它。

标签: vb.net visual-studio-2010 file-io progress-bar sleep


【解决方案1】:

如果不使用Multithreading,您将无法执行此类操作,因此我更改了您的代码的某些部分,如下所示:

Public Class FileWriting

Private Sub FileWriting_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Me.Invoke(New MethodInvoker(Sub() setprogressbarminmax()))
    Dim min_value As Integer = 0
    Dim max_value As Integer = 0

    Me.Invoke(New MethodInvoker(Sub() min_value = ProgressBar1.Minimum))
    Me.Invoke(New MethodInvoker(Sub() max_value = ProgressBar1.Maximum))

    For i = min_value To max_value
        System.Threading.Thread.Sleep(10)
        If i < 99 Then
            Me.Invoke(New MethodInvoker(Sub() setprogvalue()))
        End If
    Next i
End Sub

Private Sub setprogressbarminmax()
    ProgressBar1.Minimum = 1 : ProgressBar1.Maximum = 100
End Sub

Private Sub setprogvalue()
    ProgressBar1.Value += 2
    ProgressBar1.Value -= 1
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    Me.Close()
End Sub 

End Class

【讨论】:

  • 你也可以找到更多关于BackgroundWorker的信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2019-02-22
  • 2014-06-11
  • 2016-07-30
相关资源
最近更新 更多