返回信息流上次求助“读取特定格式的txt”的问题很感谢大家!wangjianzhou,ahomer,Kazuki,whui你们真的很棒!我最后用split函数+正则表达式解决了,谢谢!
这次是这样的:
现在完成了:一行一行读txt,并进行相应操作。想实现:每读完一行,就让进度条涨一点,当然是在另外一个线程中。
我的思路是:获得整个txt的文件大小total(已完成),再得到刚读完的这一行的数据大小session(未完成,c#下有专门的函数吗?),每读完一行session就累加一次,single/total就是当前进度条的value。但是我不知道具体怎么实现。网上的例子没有注释,不知所云。委托什么的也不太懂原理。在这里求助大家,谢谢!
这是一条镜像帖。来源:北邮人论坛 / dot-net / #3507同步于 2011/11/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖
【请问】c#的多线程实现进度条的问题
ymc252669096
2011/11/26镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
【 在 ymc252669096 的大作中提到: 】
: 上次求助“读取特定格式的txt”的问题很感谢大家!wangjianzhou,ahomer,Kazuki,whui你们真的很棒!我最后用split函数+正则表达式解决了,谢谢!
: 这次是这样的:
: 现在完成了:一行一行读txt,并进行相应操作。想实现:每读完一行,就让进度条涨一点,当然是在另外一个线程中。
: ...................
你是读txt中字符而不是像上传文件那样复制整个TXT文档,这样所有字符的大小和TXT文档是有差别的。
一是一行一行的读,我觉得你是用StreamReader的ReadLine()方法,ReadLine()方法读一行的时间应该是差不多相同的。所以建议你这样做,的到总行数N,用当前函数去除N,每读一行,触发一个进度条走动函数。
既然已经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
【 在 Kazuki 的大作中提到: 】
: 既然已经split过了,那么总行数应该是知道的,建议用当前行数/总行数表示进度,反正进度条也就是那么个意思而已,不用太精确。。。
: .net有个很好用的多线程控件,叫BackgroundWorker,你可以弄一个这个控件,并修改它的WorkerReportsProgress属性为True,然后在它的DoWork事件中做你读取文件的这个操作,并用BackgroundWorker.ReportProgress()去报告进度,这个方法只需要传出一个0到100之间的整数,然后在它的ProgressChanged事件中去用e.ProgressPercentage获取到报告的进度,然后去更新进度条
: 下面这段代码假定你已经有了一个名为Button1的按钮,按下这个按钮会开始操作,一个名为ProgressBar1的进度条,其范围是(0,100),步长是1,一个名为BackgroundWorker1的BackgroundWorker控件,其WorkerReportsProgress属性已修改为True
: ...................
哇,真详细呐~谢谢~