思路如下:
举个例子,如果我想让进度条走的快一些(单纯的操作进度条,就是改它的value,在maxnum相同的条件下),那我让多个线程来共同完成,每个线程完成一段,在显示进度条的value 之前把每个进程运算到的值加在一起赋值给value,然后显示。代码如下:namespace WindowsApplication34
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread[] threadarray= new Thread[10]; //记录线程数目
int numberThread = 0; //记录每个线程运算到的值
int[] SThread=new int[10]; private void Form1_Load(object sender, EventArgs e)
{ }
private void loopCount()
{
int n = Convert.ToInt32(this.textBox1.Text);
int tn = Convert.ToInt16(Thread.CurrentThread.Name); int p = 0; int MinNum = 0;
int MaxNum = n;
if (this.progressBar1.InvokeRequired)
{
this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Minimum = MinNum;this.progressBar1.Maximum = MaxNum;});
}
if(tn==numberThread)
{
p=n/(numberThread)+n%(numberThread);
}
else
{
p = n / (numberThread);
}
for (int i = 0;i<=p;i++ )
{
SThread[tn] = i; int s = 0; for (int m = 0; m <= numberThread; m++)
{ s += SThread[m];
}
if (this.progressBar1.InvokeRequired) this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Value = s; });
else
this.progressBar1.Value = s;
}
} private void buttonX1_Click(object sender, EventArgs e)
{
if (numberThread >= 0 && numberThread <= 9)
{
threadarray[numberThread] = new Thread(new ThreadStart(loopCount));
threadarray[numberThread].Name = Convert.ToString(numberThread);
threadarray[numberThread].Start();
numberThread += 1;
}
else
{
MessageBox.Show("已经够10个线程了!!");
return;
}
//Thread newthread = new Thread(new ThreadStart(loopCount));
//newthread.Start();
}
}
}
举个例子,如果我想让进度条走的快一些(单纯的操作进度条,就是改它的value,在maxnum相同的条件下),那我让多个线程来共同完成,每个线程完成一段,在显示进度条的value 之前把每个进程运算到的值加在一起赋值给value,然后显示。代码如下:namespace WindowsApplication34
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread[] threadarray= new Thread[10]; //记录线程数目
int numberThread = 0; //记录每个线程运算到的值
int[] SThread=new int[10]; private void Form1_Load(object sender, EventArgs e)
{ }
private void loopCount()
{
int n = Convert.ToInt32(this.textBox1.Text);
int tn = Convert.ToInt16(Thread.CurrentThread.Name); int p = 0; int MinNum = 0;
int MaxNum = n;
if (this.progressBar1.InvokeRequired)
{
this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Minimum = MinNum;this.progressBar1.Maximum = MaxNum;});
}
if(tn==numberThread)
{
p=n/(numberThread)+n%(numberThread);
}
else
{
p = n / (numberThread);
}
for (int i = 0;i<=p;i++ )
{
SThread[tn] = i; int s = 0; for (int m = 0; m <= numberThread; m++)
{ s += SThread[m];
}
if (this.progressBar1.InvokeRequired) this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Value = s; });
else
this.progressBar1.Value = s;
}
} private void buttonX1_Click(object sender, EventArgs e)
{
if (numberThread >= 0 && numberThread <= 9)
{
threadarray[numberThread] = new Thread(new ThreadStart(loopCount));
threadarray[numberThread].Name = Convert.ToString(numberThread);
threadarray[numberThread].Start();
numberThread += 1;
}
else
{
MessageBox.Show("已经够10个线程了!!");
return;
}
//Thread newthread = new Thread(new ThreadStart(loopCount));
//newthread.Start();
}
}
}
解决方案 »
- 大家来看看!~我下了一个视频拍照的代码,我想给拍照下来的图片都加上水印,如何加啊?(代码奉上)
- “每分钟执行一次关闭指定进程”的小服务要怎么做?
- Winform程序引用office组件的发布
- 给sqladapter的SelectCommand赋值的代码怎么写?
- DataView中用RowFilter过滤出来的数据集合怎么再转换成一个DataTable?
- !!!深圳软件项目招商!!!http://web.yyccad.com/
- 紧急求助,C#调dll传参数问题,我已经搞了三天,没有结果呀
- 写.html文件
- 请问,在DataGrid中(每个分页)如何获得某一列的Total值,并且Total值为之前所有的累加
- ToSingle()不能用?
- 大家帮解决一下!!!我是新手!!!急急!!
- DataGridView中,行中有单元格处于编辑状态下时,如何删除行?
这两天很忙,还没来的及实现。。
To: xvting(xvting) 理论上是可以,我也认同你的观点。可实际上比我用单线程慢了不少。不知道为什么
TO: 以后回复的人。其实怎么加到不重要,重要的是 ,一个进度条需要多个线程完成,的这个分配机制!!!
写一个继承类,继承基类,进行改变进度值的工作写一个工作类,起一个线程池,线程池加载若干个,运行继承类的工作先模拟一下,如果可以,再赋值给UI线程
========================
http://cache.monocn.com
To: xvting(xvting) 理论上是可以,我也认同你的观点。可实际上比我用单线程慢了不少。不知道为什么
执行“ this.progressBar1.Invoke((MethodInvoker)delegate { this.progressBar1.Minimum = MinNum;this.progressBar1.Maximum = MaxNum;});“
肯定很消耗时间的,需要等待。问题出在多线程的交互上!可以这样解决这个问题:(主要思想是避免多线程直接交互,我是这样解决的,哈哈)一个线程设置进度条的变化,不妨称它为主线程。其他若干线程计算值,但是若干线程各算各的,每个线程计算完成后将结果保存下来,(保存方式可以是数据库 或文件,最好是数据库,方便操作)。主线程周期访问库里的数据,并计算修改进度条。速度一点都不慢。
=============================================估计数据库那也会很浪费时间,因为它面临的不是一次的存取,而且主线程的周期长短也造成显示的同步与速度的矛盾。如果长的话显示同步性就差,速度会快一点,如果短的话,同步会接近一点,速度就会明显的降下来。感觉你这个思路挺适合UI显示的。一次性完成,把UI显示单划出一个线程来。其他的计算或是操作放到别的多线程里,对了,感觉用异步就ok了,不用多线程了。--------个人观点,供大家讨论。
这样把,关于多线程完成同一个任务的思路,拿个具体例子来说,就是讯雷的多个线程下同一个文件,并且在程序中也有个整体下载进度条。大家看看是怎么实现的,或者有什么更好的实现思路。
(最初的那个程序只是想简化一下思路。)