进度条同步更新问题
主进程有一Button 点击后 工作线程bgThread开始实现文件的复制 剪切 同时前台弹出一新窗口frmProgress内有一ProgressBar用来显示工作线程的进度
我现在的实现方法是在frmProgress中使用Thread.Timer通过来判断bgThread.ThreadState 如果非ThreadState.Stop就通过 已复制文件/总文件来同步更新ProgressBar的值
我想问下 像这类问题大家一般都是如何实现的
------解决方案--------------------我来帮你一把吧兄弟,我刚才实验了一下,希望能帮到你.还有周末快乐啊.呵呵
我的做法是基于流的思想(感觉像废话,先鄙视自己一下先.)
需要引入System.IO命名空间
//我仅仅是一个例子,你可以根据需要去进行必要的控制.我的是命令控制台的
//定义一个文件流,放在当前目录中,名字是demo.pdf
FileStream fs = new FileStream(@ "..\..\demo.pdf ", FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] buffer = new byte[fs.Length];
//解析成二进制流后存储到byte数组中
br.Read(buffer, 0, buffer.Length);
br.Close();
fs.Close();
//重新定义文件流
fs = new FileStream(@ "..\..\kevin.pdf ", FileMode.Create);
//下面的仅仅是为了演示.我用的示例文件有20多M,所以数组的长度是21055411
//楼主如果想做这个实验,那么下面的a就需要改动一下了.
//为了适应一个变化的环境,最好用一个循环来做,比如把进度条分成100个等分,也就是说
//每复制了1%,进度条就会向前走一点.不过设置的时候要耐心些,否则很容易算错
int max = buffer.Length;
Console.WriteLine(max);
int a = 10000000;
fs.Write(buffer,0,a);
Console.WriteLine( "press anykey to continue ");
Console.ReadKey();
//这个时候是最容易出错的.
//首先,数组是从0下标开始的,所以会发现上面的流写了a这么长,而下面却是从a位置开始写
//还有就是要写入的长度,一定是buffer.Length减去前面已经复制的长度
//如果要分等分的话,比如分100份,通过除法得出来是每份的长度为b的话,那么b*100肯定是要
//不等于源文件大小的,原因很简单,因为除的结果很可能是小数,而我们却把它转换成了整数
//解决的办法也很简单就是循环99次
//第100次的时候单独写fs.Write(buffer,b*99,buffer.Length-b*99)
//应该是没有错的,如果真的算错了,只要LZ耐心些肯定能解决的
fs.Write(buffer,a, max-a);
fs.Close();