标签未使用进度条在状态条中更新
本文关键字:状态 更新 标签 未使用 | 更新日期: 2023-09-27 18:29:55
我一直在vc#express 2013中开发一个windows窗体应用程序。我有一个状态条控件,其中有一个标签和一个进度条。我想在标签中显示进度条的进度,但它没有用进度条值更新。只有当进度条完成时,即当值为100并且作业完成时,它才会被更新。奇怪的是进度条更新了,但标签没有。。。你知道这里会发生什么吗?顺便说一句,我在自己的代码中引发了一个进度事件,该事件得到了处理,进度也相应地更新了。。。感谢
我在MGFDataHandler类中引发事件ProgressTick
if ((hundredthValue*progressMultiplier == lineCounter) || (lineCounter==totalLines))
{
//Raise the progress bar event!
EventHandler handler = ProgressTick;
if (handler != null)
{
handler(this, e);
}
progressMultiplier++;
}
然后我在windows窗体中处理它,如下所示:
void msDataHandler_ProgressTick(object sender, EventArgs e)
{
var progress = (int)((MGFDataHandler)sender).progressMultiplier;
if (progress < 100)
{
this.progressStatusString.Text = "Progress: " + progress + "%";
this.progressBar.Visible = true;
this.progressBar.Value = progress;
}
else
{
this.progressStatusString.Text = "Done";
this.filterMSDataToolStripMenuItem.Enabled = true;
}
}
启动整个事件的函数位于windowsform_activated事件中,MGFDataHandler对象是windowsform的一个属性。
private void GlycoMSPipelineMainFrame_Activated(object sender, EventArgs e)
{
switch (this.whoActivatedMe)
{
case WhoActivatedMe.MSFilterWizard:
{
this.whoActivatedMe = WhoActivatedMe.Me;
foreach (String currentmgffilename in this.currentMGFFileNames)
{
mgfDataHandler.Filter_MS_Data(currentmgffilename);
}
this.populateTreeViews();
break;
}
default:
{
break;
}
}
}
引发事件的是Filter_MS_Data。
尝试使用后台工作程序(位于System.componentModel中)来运行您正在执行的任务。当更新标签或进度返回时,您需要检查是否需要调用。
像这样的东西。
If (label.InvokeRequired) {
label.Invoke(new MethodInvoker(delegate
{
label.Text = progress.Value;
});
}
需要调用来防止跨线程操作,而跨线程操作又会产生争用条件。
请原谅我在手机上打出来的格式。
您需要使用后台工作人员执行填充。我认为这将解决你的问题。
编辑:后台工作程序提供一个将在另一个线程上运行的do work事件。它还提供了一个已完成的事件,以便您知道任务何时完成。
我认为这里发生的事情是你的程序在ui线程上执行工作,这阻止了ui的完全更新。
我确实需要更多的信息来获得完整的答案,但我很清楚它的发展方向。
问题是,您可能在同一个线程中执行所有操作。当你有一个大的工作时,你需要使用一个后台线程来完成这项工作,并让主线程(即UI线程)来处理UI。
这是一个大主题,我在这里只是触及了表面,所以首先阅读以下链接,并尝试为您的工作创建一个线程,并自己调用进度条的更新。如果不成功,请发布一个包含更多信息的新问题。
你应该阅读的链接是:
- C中的线程#
- C中的ProgressBar#
我意识到这是一个非常古老的问题,但我在VS2019中发现了同样的问题。我发现,您可以调用标签和ProgressBar的容器的Refresh方法,而不是添加线程。
void msDataHandler_ProgressTick(object sender, EventArgs e)
{
var progress = (int)((MGFDataHandler)sender).progressMultiplier;
if (progress < 100)
{
this.progressStatusString.Text = "Progress: " + progress + "%";
this.progressBar.Visible = true;
this.progressBar.Value = progress;
}
else
{
this.progressStatusString.Text = "Done";
this.filterMSDataToolStripMenuItem.Enabled = true;
}
this.progressStatusString.Owner.Refresh();
}