0

我正在执行一个 DLL,它使用它通过引用backgroundWorker1更新变量。i要使用 更新进度条i,我使用以下代码。我还想将百分比显示为文本。问题是文本(不是进度条)闪烁很多。如何减少/消除这种闪烁?增加睡眠时间不是一种选择。

BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.DoWork += (s, args) =>
{
   Mydll.MyCFunction(ref i);
};
backgroundWorker1.RunWorkerAsync();

while (backgroundWorker1.IsBusy)
{
    backgroundWorker1.ReportProgress(i * 100);               
    backgroundWorker1.ProgressChanged += (s, e) =>
    {
       progressBar1.Refresh();
       progressBar1.Value = e.ProgressPercentage;
       progressBar1.CreateGraphics().DrawString(e.ProgressPercentage.ToString() + "%",
            SystemFonts.DefaultFont, Brushes.Black,
            new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
    };
    Application.DoEvents();
    System.Threading.Thread.Sleep(200);
}

谢谢。

4

4 回答 4

1

您的代码将多次订阅 ProgressChanged 事件。您应该只需要订阅一个事件。拥有所有这些事件将意味着对于每个进度更改,进度条上的刷新次数将会增加。

我建议为进度更改事件创建一个单独的事件处理程序,并确保您只订阅一次。

所以,尽量保持你的设计:

为 ProgressChanged 订阅事件处理程序(在别处声明的事件处理程序)

环形 {

报告进度

做事件

睡觉 }

作为旁注,你为什么要睡觉?

于 2013-04-08T09:57:59.787 回答
1

如果图形闪烁,您应该启用双缓冲。

DoubleBuffered = true

或者

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

更多信息:http: //msdn.microsoft.com/en-us/library/3t7htc9c.aspx

于 2013-04-08T10:22:34.857 回答
0

您的代码有多个错误。其中之一,一般来说是 call Application.DoEvents。这可能在 15 年前的 VB6 中很有用,但那是技术石器时代。您还多次将相同的处理程序附加到事件,这意味着在 100 次循环后,您的绘图将被调用 100 次/百分比。

有这么多错误,很难建议一个简单的修复。在这里查看两种简单的方法来完成这项工作。尝试了解发生了什么,以什么顺序以及为什么。

于 2013-04-08T10:01:23.490 回答
0

首先,我会删除该行Application.DoEvents();(关于 do 事件的优秀帖子),这通常表明多线程设计不佳。我也会Thread.Sleep亲自删除电话。

其次,您应该订阅ProgressChangedOUTSIDE 的工作循环。例如:

public Form1()
{
    bgWorker.ProgressChanged += bgWorker_ProgressChanged;
}

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
    progressBar1.CreateGraphics().DrawString(e.ProgressPercentage.ToString() + "%",
            SystemFonts.DefaultFont, Brushes.Black,
            new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
}
于 2013-04-08T10:02:42.190 回答