标签未使用进度条在状态条中更新

本文关键字:状态 更新 标签 未使用 | 更新日期: 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();
    }