热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

100分求助多线程进度条问题

现在有一个封装好了的数据处理函数DataExcu()处理数据需要5分钟左右因此想弄个进度条如下:1.Form1中设置DataExcu()
现在有一个封装好了的数据处理函数 DataExcu()    处理数据需要5分钟左右


因此想弄个进度条

  如下:
   
        1.Form1中设置DataExcu()函数的参数后  点击按钮“开始处理” 然后弹出一个新的窗体Form2 
Form2带进度条  当Form1数据处理完成时候  From2显示完成 进度条隐藏  (小弟看了多线程的例子  晕乎乎的) 


    本人小菜  谢谢各位了先

27 个解决方案

#1


占位学习。

#2


#3


比较好的方式是DataExec能汇报它的进度。
如果不能的话,启动一个Timer(Forms.Timer)来模拟进度。由于跳表事件发生在UI线程,所以可以直接在timer_Tick中更新进度条。

启动Timer的同时开始运行DataExec,运行完毕后通知UI线程停止Timer和进度条。

ThreadPool.QueueUserWorkItem(delegate
{
    this.DataExec();
    this.OnDataExecDone(this, EventArg.Empty);
});

void OnDataExecDone(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new EventHandler(OnDataExecDone));
    }
    else
    {
        HideProgressBar();
    }
}

#4


可以的,本人以前做过这样的例子。
点击Form1中的按钮弹出Form2,在Form2中启动处理事件,同时在Form2中显示进度,等Form2中处理完之后关闭Form2。

#5


至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客: .net 2.0 BackgroundWorker类详细用法

#6


引用 3 楼 gomoku 的回复:
比较好的方式是DataExec能汇报它的进度。
如果不能的话,启动一个Timer(Forms.Timer)来模拟进度。由于跳表事件发生在UI线程,所以可以直接在timer_Tick中更新进度条。

启动Timer的同时开始运行DataExec,运行完毕后通知UI线程停止Timer和进度条。
C# code
ThreadPool.QueueUserWorkItem(delegate
{this.DataExec();this.OnDataExecDone(this, EventArg.Empty);
});void OnDataExecDone(object sender, EventArgs e)
{if (this.InvokeRequired)
    {this.Invoke(new EventHandler(OnDataExecDone));
    }else
    {
        HideProgressBar();
    }
}


可以不用模拟进度  只要界面不假死就ok了  进度条可弄个假进度条

#7


不知道

#8


引用 5 楼 zhoufoxcn 的回复:
至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客:.net 2.0 BackgroundWorker类详细用法

这个控件我也看过了  可还是不会用  大侠能按照我的这个需求给简单写下例子吗

#9


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication192
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Button B = new Button();
            B.Parent = this;
            B.Click += new EventHandler(B_Click);
        }

        void B_Click(object sender, EventArgs e)
        {
            DataExcu();
        }

        void DataExcu()
        {
            ProgressBar PB = new ProgressBar();
            PB.Parent = this;
            PB.BringToFront();
            PB.Maximum = 20000;
            PB.Location = new Point((this.ClientRectangle.Width - PB.Width) / 2,
                (this.ClientRectangle.Height - PB.Height) / 2);

            new Thread(new ParameterizedThreadStart(DoStep)).Start(PB);

        }

        void DoStep(Object Obj)
        {
            ProgressBar PB = (ProgressBar)Obj;

            for (int i = 0; i < PB.Maximum; i++)
                this.Invoke(new SetProgressBarValue(DoSetProgressBarValue), new Object[] { PB });
        }

        delegate void SetProgressBarValue(ProgressBar PB);

        void DoSetProgressBarValue(ProgressBar PB)
        {
            if (++PB.Value == PB.Maximum)
                PB.Dispose();
        }
    }
}

#10



public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ProgressForm progressForm = new ProgressForm();
        ThreadPool.QueueUserWorkItem(delegate
        {
            DataExec();
            progressForm.End();          //<--关闭进度条
        });
        progressForm.ShowDialog(this);
    }
}

class ProgressForm : Form
{
    int progress = 0, target = 5 * 60;
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

    public ProgressForm()
    {
        this.StartPosition = FormStartPosition.CenterParent;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Size = new Size(200, 32);
        this.timer.Tick += delegate { progress++; this.Invalidate(); };
        this.timer.Start();
    }

    public void End()
    {
        this.Invoke(new MethodInvoker(this.Close()));
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.Clear(Color.PeachPuff);
        int width = this.Width * progress / target;
        width = Math.Min(width, this.Width);
        e.Graphics.FillRectangle(Brushes.Aqua, 0, 0, width, this.Height);
    }
}

#11


以上代码没有实际意义,仅供参考

#12


引用 11 楼 wartim 的回复:
以上代码没有实际意义,仅供参考


可不能把我的也算进去 :)
我的玩具我自己宝贝。

#13


System.ComponentModel.BackgroundWorker bkgWorker = new BackgroundWorker();

            bkgWorker.ProgressChanged += new ProgressChangedEventHandler(bkgWorker_ProgressChanged);
            bkgWorker.WorkerReportsProgress = true;

 private void bkgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            
            进度条psBarAll.Value = e.ProgressPercentage+1;
                    }


#14


 private void bkgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
做具体的事情
}

#15


引用 12 楼 gomoku 的回复:
引用 11 楼 wartim 的回复:
以上代码没有实际意义,仅供参考


可不能把我的也算进去 :)
我的玩具我自己宝贝。

先看看 自己消化一下

#16


 private void button1_Click(object sender, EventArgs e)
     {
      new System.Threading.Thread(new System.Threading.ThreadStart(Start)).Start(); 
    }
   public void Start()
     {   
      
    }
     void A(long total, long current)
     {
         if (this.InvokeRequired)
        {
           //调用方法
         }
         else
         {
             this.progressBar1.Maximum = (int)total; 
             this.progressBar1.Value = (int)current; 
         }
  }

#17


引用 5 楼 zhoufoxcn 的回复:
至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客:.net 2.0 BackgroundWorker类详细用法


记下了。

#18


学习

#19


xuexi

#20


路过,学习.
好像进度条这个问题不止C#处理不方便,其他语言也不怎么地.

#21


引用 7 楼 jrrlee 的回复:
不知道

很经典啊...

#22


引用楼主 happia004 的回复:
现在有一个封装好了的数据处理函数 DataExcu()    处理数据需要5分钟左右


因此想弄个进度条

  如下:
 
        1.Form1中设置DataExcu()函数的参数后  点击按钮“开始处理” 然后弹出一个新的窗体Form2
Form2带进度条  当Form1数据处理完成时候  From2显示完成 进度条隐藏  (小弟看了多线程的例子  晕乎乎的)


    本人小菜  谢谢各位了先


数据处理函数 DataExcu() 是有参数的。。。。。。。

#23


引用 12 楼 gomoku 的回复:
引用 11 楼 wartim 的回复:
以上代码没有实际意义,仅供参考


可不能把我的也算进去 :)
我的玩具我自己宝贝。



啊.....窜楼了。。。我说我的。。。

#24


学习                   。

#25


学习 。

#26


我的问题跟你一样 LZ怎么解决的

#27


只要  控件做个计数的变量时候的改变,然后在新建的进度条窗口去处理都可以了吧

推荐阅读
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有