减少/删除进度条内的文本闪烁

本文关键字:文本 闪烁 删除 减少 | 更新日期: 2023-09-27 18:07:55

我正在使用backgroundWorker1执行DLL,该DLL通过引用更新变量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);
}

谢谢。

减少/删除进度条内的文本闪烁

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

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

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

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

循环{

ReportProgress

DoEvents

睡眠}

作为旁注,您为什么要休眠线程?

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

DoubleBuffered = true

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

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

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

有这么多错误,很难提出一个简单的解决办法。请看这里的两种简单方法。试着去理解发生了什么,发生的顺序和原因。

首先,我要删除Application.DoEvents();行(关于do事件的优秀帖子),这通常表明糟糕的多线程设计。我个人也会删除Thread.Sleep调用。

其次,您应该在工作循环中订阅ProgressChanged OUTSIDE。例如:

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));
}