关于进度条 progressBar 的使用

harvey11 2012-11-06 01:55:12
需求:
1、点击主窗体Form1的一个Button弹出进度条窗体Form2(为模式窗体、仅有一个进度条、Style为Marquee即不停滚动那种)
2、同时主窗体继续生成数据的任务,直至任务完成
3、任务完成后自动关闭这个进度条窗体

问题:
1、在Form1里直接Form2.Show(),如果后续没有处理可以正常显示滚动,但一旦有后续处理进度条就不动。
2、Form2.ShowDialog(),可以正常显示滚动,但不执行后续处理。

怎么样即正常显示进度条,又能继续往下处理?

PS:差了些资料需要用的线程相关的东西,试了一些做法都是出现进度条没问题,一加上后续处理进度条就不动了。

求解,并希望各位大侠直接贴出代码。



...全文
287 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2012-11-07
  • 打赏
  • 举报
回复
你要做的不是滚动条,是 等待操作, 你用 DoWork 就可以了。
harvey11 2012-11-07
  • 打赏
  • 举报
回复
楼上所述问题,求指教
harvey11 2012-11-07
  • 打赏
  • 举报
回复
引用 11 楼 qiaohuyue 的回复:
你要做的不是滚动条,是 等待操作, 你用 DoWork 就可以了。
明白了,转换思路,谢谢!
harvey11 2012-11-06
  • 打赏
  • 举报
回复
把代码做如下修改:

        private void ShowProcessBar()
        {
            Form2 myProcessBar = new Form2();
            myProcessBar.Show();
            Application.DoEvents();
        }
        private void button4_Click(object sender, EventArgs e)
        {

            Thread thdSub = new Thread(new ThreadStart(ThreadFun));
            thdSub.Start();

            int i, j, k;
            if (true)
            {
                for (i = 0; i <= 10000; i++)
                {
                    for (j = 0; j <= 100000; j++)
                    {
                        k = j;
                    }
                }
            }
            thdSub.Abort();
            thdSub = null;
        }
进度条可以正常显示滚动,代码也可以继续执行下去,但是无法关闭进度条窗体。求解。。。
harvey11 2012-11-06
  • 打赏
  • 举报
回复
引用 6 楼 conan8126 的回复:
“我在最后For循环后加上 refreshFlag = false; 结果画面一闪就结束了。” -------》 这是因为你的For循环执行的时间非常短导致的,跟那个弹出画面没有关系。
我把循环的上限多加几个0也还是这样,应该是执行顺序的问题。
蝶恋花雨 2012-11-06
  • 打赏
  • 举报
回复
http://chenxing.blog.51cto.com/240526/76279、参考
conan8126 2012-11-06
  • 打赏
  • 举报
回复
“我在最后For循环后加上 refreshFlag = false; 结果画面一闪就结束了。”
-------》
这是因为你的For循环执行的时间非常短导致的,跟那个弹出画面没有关系。
harvey11 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 conan8126 的回复:
这个需要用多线程实现 1. 首先定义一个全局变量 private bool refreshFlag; 2. 然后添加显示滚动条画面的方法 private void ShowWaitInfo() { WaitScreen infoWin = new WaitScreen(); infoWin.Show(); while (r……
我在最后For循环后加上 refreshFlag = false; 结果画面一闪就结束了。 好像是先执行完button4_Click再去执行ShowProcessBar()。
harvey11 2012-11-06
  • 打赏
  • 举报
回复
一加上后面注释部分,进度条就不动了。
harvey11 2012-11-06
  • 打赏
  • 举报
回复
我的代码 Form1:

        private void ShowProcessBar()
        {
            Form2 myProcessBar = new Form2();
            myProcessBar.ShowDialog();
        }


        private void ThreadFun()
        {
            MethodInvoker mi = new MethodInvoker(ShowProcessBar);
            this.BeginInvoke(mi);

            Thread.Sleep(500);
        }

        private void button4_Click(object sender, EventArgs e)
        {

            Thread thdSub = new Thread(new ThreadStart(ThreadFun));
            thdSub.Start();

            //int i, j, k;
            //if (true)
            //{
            //    for (i = 0; i <= 10000; i++)
            //    {
            //        for (j = 0; j <= 100000; j++)
            //        {
            //            k = j;
            //        }
            //    }
            //}
            
        }  
Form2中无代码
conan8126 2012-11-06
  • 打赏
  • 举报
回复
这个需要用多线程实现 1. 首先定义一个全局变量 private bool refreshFlag; 2. 然后添加显示滚动条画面的方法 private void ShowWaitInfo() { WaitScreen infoWin = new WaitScreen(); infoWin.Show(); while (refreshFlag) { infoWin.Refresh(); } infoWin.Close(); } 3. 最后在你需要显示滚动条的方法中添加如下代码 refreshFlag = true; Thread threadShowInfo = new Thread(new ThreadStart(ShowWaitInfo)); threadShowInfo.Start(); 4. 在需要的查询或其他操作执行完毕后,添加如下代码 refreshFlag = false;
王思明 2012-11-06
  • 打赏
  • 举报
回复
SqlDataReader Rs = null; new clsProgressBarThread(this, "正在查詢,請稍後.......") { ThreadFun = delegate { Rs = this.MyEcute.GetRecord(strSql); } }.StartShow(); if (Rs != null) { gridInfo.Rows = 1; int row = 1; gridInfo.AutoRedraw = false; gridInfo.Refresh(); while (Rs.Read()) { gridInfo.Rows++; row = gridInfo.Rows - 1; for (int i = 0; i <= (Rs.FieldCount - 1); i++) { gridInfo.Cell(row, i + 1).Text = Convert.ToString(Rs[i]); } row++; } Rs.Close(); gridInfo.AutoRedraw = true; gridInfo.Refresh(); }

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧