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

happia004 2009-12-03 11:00:15
现在有一个封装好了的数据处理函数 DataExcu() 处理数据需要5分钟左右


因此想弄个进度条

如下:

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


本人小菜 谢谢各位了先
...全文
1665 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhushoudong 2011-02-25
  • 打赏
  • 举报
回复
只要 控件做个计数的变量时候的改变,然后在新建的进度条窗口去处理都可以了吧
lxgloveme 2010-08-19
  • 打赏
  • 举报
回复
我的问题跟你一样 LZ怎么解决的
lsh2216024 2010-03-18
  • 打赏
  • 举报
回复
学习 。
xzq12345 2010-03-03
  • 打赏
  • 举报
回复
学习 。
cstester 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhoufoxcn 的回复:]
至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客:.net 2.0 BackgroundWorker类详细用法
[/Quote]

记下了。
wuyq11 2009-12-03
  • 打赏
  • 举报
回复
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;
}
}
happia004 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gomoku 的回复:]
引用 11 楼 wartim 的回复:
以上代码没有实际意义,仅供参考


可不能把我的也算进去 :)
我的玩具我自己宝贝。
[/Quote]
先看看 自己消化一下
daichenghua 2009-12-03
  • 打赏
  • 举报
回复
private void bkgWorker_DoWork(object sender, DoWorkEventArgs e)
{
做具体的事情
}
daichenghua 2009-12-03
  • 打赏
  • 举报
回复
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;
}


gomoku 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wartim 的回复:]
以上代码没有实际意义,仅供参考
[/Quote]

可不能把我的也算进去 :)
我的玩具我自己宝贝。
wartim 2009-12-03
  • 打赏
  • 举报
回复
以上代码没有实际意义,仅供参考
gomoku 2009-12-03
  • 打赏
  • 举报
回复

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);
}
}
wartim 2009-12-03
  • 打赏
  • 举报
回复
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();
}
}
}
happia004 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhoufoxcn 的回复:]
至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客:.net 2.0 BackgroundWorker类详细用法
[/Quote]
这个控件我也看过了 可还是不会用 大侠能按照我的这个需求给简单写下例子吗
jrrlee 2009-12-03
  • 打赏
  • 举报
回复
不知道
happia004 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 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();
}
}
[/Quote]

可以不用模拟进度 只要界面不假死就ok了 进度条可弄个假进度条
周公 2009-12-03
  • 打赏
  • 举报
回复
至于在Form2控制进度条不建议使用多线程,因为涉及到UI并发控制问题,可以使用BackGroundworker类。至于这个类的用法,可参加本人博客:.net 2.0 BackgroundWorker类详细用法
周公 2009-12-03
  • 打赏
  • 举报
回复
可以的,本人以前做过这样的例子。
点击Form1中的按钮弹出Form2,在Form2中启动处理事件,同时在Form2中显示进度,等Form2中处理完之后关闭Form2。
gomoku 2009-12-03
  • 打赏
  • 举报
回复
比较好的方式是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();
}
}
happia004 2009-12-03
  • 打赏
  • 举报
回复
加载更多回复(7)

110,536

社区成员

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

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

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