减少/删除进度条内的文本闪烁
本文关键字:文本 闪烁 删除 减少 | 更新日期: 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));
}