【c#实时进度栏】

电脑杂谈  发布时间:2020-05-02 17:19:58  来源:网络整理

c语言实现pid算法_c#进度条实现_c#进度条显示百分比

请记住,当我在大二的时候,我正在和老师一起做一个项目. 那时,我是编程的新手,但是技术很糟糕. 那时,有一个功能可以将shapfile文件中的属性表导出为本地Excel(* xls)格式. 考虑到我是否可以制作一个进度条来改善用户体验,我很兴奋地将进度条拖到窗口中(这是最好的),然后将各种汤汤拖到最后c#进度条实现,终于意识到了c#进度条实现,但发现只有当表当记录很少时,进度条可以实时更新. 否则,当有许多记录时,直到完成导出后进度条直接充满血液,进度条才会更新. 当时,这是非常忧郁的. 百度和谷歌了解到这叫做“ UI阻止”,我必须打开另一个线程来解决它. 现在我更加忧郁. 那时,我“闻到线程变色”. 我不能做这种“黑科技”! ! !

namespace Progress
{
    public delegate void SetProgressValueEventHandler(int pos);//设置进度值的委托 定义参数列表
}

c#进度条显示百分比_c#进度条实现_c语言实现pid算法

namespace Progress
{
    public partial class MainFrm : Form
    {
        public event SetProgressValueEventHandler SetProgressValueEvent;//定义事件用于回调
        public Thread ProcessThread //定义子线程用于处理耗时任务
        {
            get;
            set;
        }
        public MainFrm()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ProcessThread = new Thread(new ThreadStart(HandleThread));//子线程初始化
            ProgressFrm pFrm = new ProgressFrm(this);
            ProcessThread.Start();//开启线程        
            pFrm.Show();
        }
        private void HandleThread()//线程处理函数,实现耗时任务
        {
            Run run = new Run();
            run.RunProgress(150, SetProgressValueEvent);
        }
    }
}

 class Run
 {
      public void RunProgress(int range, SetProgressValueEventHandler setProgressBar)
      {
         try
         {
             for (int i = 0; i < range; i++)
             {
                 Thread.Sleep(100);
                 //int p = 10 / (i - 10);//此处为了验证程序错误响应处理,当i=10时触发异常
                 setProgressBar(i * 100 / range);
             }
             setProgressBar(100);//耗时任务结束,进度条达到100;
         }
        catch (System.Exception ex)
        {
             System.Console.WriteLine(ex.Message);
             setProgressBar(101);//处理任务失败,向进度窗口传递消息传递值大于100或小于0的数
        }
     }
}

c#进度条实现_c#进度条显示百分比_c语言实现pid算法

namespace Progress
{
    public partial class ProgressFrm : Form
    {
        private MainFrm mFrm;
        public ProgressFrm(MainFrm mFrm)
        {
            InitializeComponent();
            this.mFrm = mFrm;
            //绑定事件处理函数
            mFrm.SetProgressValueEvent += new SetProgressValueEventHandler(OnProgressValueChanged);
        }
        private void OnProgressValueChanged(int pos)//事件处理函数,设置进度条和进度值
        {
            SetProgressBarValueInvoke(pos);
            SetProgressLabelValueInvoke(pos);
        }
        private void SetProgressBarValueInvoke(int pos)//跨线程调用
        {
            if (progressBar.InvokeRequired)
            {
                SetProgressValueEventHandler setProgress = new SetProgressValueEventHandler(SetProgressBarValue);
                progressBar.Invoke(setProgress, new object[] { pos });
            }
            else
            {
                SetProgressBarValue(pos);
            }
        }
       private void SetProgressBarValue(int pos)
        {
            //this.progressBar.Value = pos;
            if (pos <= progressBar.Maximum && pos >= 0)
            {
                this.progressBar.Value = pos;
            }
        }
        private void SetProgressLabelValueInvoke(int pos)//跨线程调用
        {
            if (label.InvokeRequired)
            {
                SetProgressValueEventHandler setProgressLabel = new SetProgressValueEventHandler(SetProgressLabelValue);
                progressBar.Invoke(setProgressLabel, new object[] { pos });
            }
            else
            {
                SetProgressBarLabelvalue(pos);
            }
        }
        private void SetProgressLabelValue(int pos)
        {
            if (pos <= progressBar.Maximum && pos >=0)
            {
                if (pos == progressBar.Maximum)
                {
                    MessageBox.Show("处理成功···", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                } 
                else
                {
                    this.label.Text = pos.ToString() + "%";
                }
            }
            else
            {
                MessageBox.Show("处理失败···", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
        }
        private void ProgressFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                mFrm.SetProgressValueEvent -= new SetProgressValueEventHandler(OnProgressValueChanged);
                mFrm.ProcessThread.Abort();
            }
            catch (System.Exception ex)
            {
            }
        }
    }
}

现在正在研究C#,该项目要求不经常使用C#,但是我想说的是,尽管C#的语法比C ++容易得多(这证明了为什么很批评C#),原因是因为微软把太多东西封装了,尽管语法很容易,但确实包含了更深层的思想.

c#进度条实现_c语言实现pid算法_c#进度条显示百分比

封装意味着抽象,这意味着需要理解更多的哲学思想. -室友(江弟兄)

对我来说,它是委托/事件对C ++函数指针的封装. 要花很长时间才能理解.

c#进度条实现_c#进度条显示百分比_c语言实现pid算法

**能力有限,请批评并指正我**

C#进度条实现源代码


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-196664-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 杨嗣复
        杨嗣复

        西方列强普遍认为北阳水师可以轻松战胜日本海军

      • 雒言
        雒言

      • 丰岛真千子
        丰岛真千子

        象是给美国出一出气

      热点图片
      拼命载入中...