BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / dot-net / #3507同步于 2011/11/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖

【请问】c#的多线程实现进度条的问题

ymc252669096
2011/11/26镜像同步4 回复
上次求助“读取特定格式的txt”的问题很感谢大家!wangjianzhou,ahomer,Kazuki,whui你们真的很棒!我最后用split函数+正则表达式解决了,谢谢! 这次是这样的: 现在完成了:一行一行读txt,并进行相应操作。想实现:每读完一行,就让进度条涨一点,当然是在另外一个线程中。 我的思路是:获得整个txt的文件大小total(已完成),再得到刚读完的这一行的数据大小session(未完成,c#下有专门的函数吗?),每读完一行session就累加一次,single/total就是当前进度条的value。但是我不知道具体怎么实现。网上的例子没有注释,不知所云。委托什么的也不太懂原理。在这里求助大家,谢谢!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
qqdog机器人#1 · 2011/11/26
LZ看看“观察者模式”这种设计模式 然后C#有个进度条的控件,让界面的代码去监听读取TXT文件的进度,从而控制进度条的进度 具体的示例代码网上应该有
wangjianzhou机器人#2 · 2011/11/26
【 在 ymc252669096 的大作中提到: 】 : 上次求助“读取特定格式的txt”的问题很感谢大家!wangjianzhou,ahomer,Kazuki,whui你们真的很棒!我最后用split函数+正则表达式解决了,谢谢! : 这次是这样的: : 现在完成了:一行一行读txt,并进行相应操作。想实现:每读完一行,就让进度条涨一点,当然是在另外一个线程中。 : ................... 你是读txt中字符而不是像上传文件那样复制整个TXT文档,这样所有字符的大小和TXT文档是有差别的。 一是一行一行的读,我觉得你是用StreamReader的ReadLine()方法,ReadLine()方法读一行的时间应该是差不多相同的。所以建议你这样做,的到总行数N,用当前函数去除N,每读一行,触发一个进度条走动函数。
Kazuki机器人#3 · 2011/11/26
既然已经split过了,那么总行数应该是知道的,建议用当前行数/总行数表示进度,反正进度条也就是那么个意思而已,不用太精确。。。 .net有个很好用的多线程控件,叫BackgroundWorker,你可以弄一个这个控件,并修改它的WorkerReportsProgress属性为True,然后在它的DoWork事件中做你读取文件的这个操作,并用BackgroundWorker.ReportProgress()去报告进度,这个方法只需要传出一个0到100之间的整数,然后在它的ProgressChanged事件中去用e.ProgressPercentage获取到报告的进度,然后去更新进度条 下面这段代码假定你已经有了一个名为Button1的按钮,按下这个按钮会开始操作,一个名为ProgressBar1的进度条,其范围是(0,100),步长是1,一个名为BackgroundWorker1的BackgroundWorker控件,其WorkerReportsProgress属性已修改为True Public Class Form1 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim lines As String() = My.Computer.FileSystem.ReadAllText("D:\text.txt").Split(New String() {vbCrLf}, StringSplitOptions.RemoveEmptyEntries) For i As Integer = 0 To lines.Length - 1 '用lines(i)去做你自己的事 Console.WriteLine(lines(i)) '报告进度(当前行数/总行数) BackgroundWorker1.ReportProgress(i * 100 / (lines.Length - 1)) Next End Sub Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged '在这里设置进度条的值 ProgressBar1.Value = e.ProgressPercentage() End Sub Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted '用来通知操作已经完成 ProgressBar1.Value = ProgressBar1.Maximum MsgBox("done") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ProgressBar1.Value = 0 '开始操作 BackgroundWorker1.RunWorkerAsync() End Sub End Class
ymc252669096机器人#4 · 2011/11/27
【 在 Kazuki 的大作中提到: 】 : 既然已经split过了,那么总行数应该是知道的,建议用当前行数/总行数表示进度,反正进度条也就是那么个意思而已,不用太精确。。。 : .net有个很好用的多线程控件,叫BackgroundWorker,你可以弄一个这个控件,并修改它的WorkerReportsProgress属性为True,然后在它的DoWork事件中做你读取文件的这个操作,并用BackgroundWorker.ReportProgress()去报告进度,这个方法只需要传出一个0到100之间的整数,然后在它的ProgressChanged事件中去用e.ProgressPercentage获取到报告的进度,然后去更新进度条 : 下面这段代码假定你已经有了一个名为Button1的按钮,按下这个按钮会开始操作,一个名为ProgressBar1的进度条,其范围是(0,100),步长是1,一个名为BackgroundWorker1的BackgroundWorker控件,其WorkerReportsProgress属性已修改为True : ................... 哇,真详细呐~谢谢~