关于C#多线程进度条的问题

问题描述

我做了一个文档扫描的软件,扫描的时候使用了多线程技术,并且对每个扫描都会弹出一个进度条的显示,现在的问题是我连续扫描三个不同的文件的时候,所有的进度条操作都在最后开的那个进度条里进行,小弟是第一次玩C#,不是很懂怎么调,接下来就是贴源代码,大家帮我看看。首先是进度条窗体usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Threading;usingSystem.IO;usingSystem.Text.RegularExpressions;namespaceWindowsFormsApplication1{publicpartialclassForm2:Form{publicstringpath1;publicForm2(){InitializeComponent();}publicboolIncrease(intnValue){if(nValue>0){if(progressBar2.Value+nValue<progressBar2.Maximum){progressBar2.Value+=nValue;returntrue;}else{progressBar2.Value=progressBar2.Maximum;progressBar2.Value=0;}}returnfalse;}}}

然后是主界面usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Text.RegularExpressions;usingSystem.Threading;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{publicstringpath1;publicForm1(){InitializeComponent();}privateForm2myProcessBar=null;privatedelegateboolIncreaseHandle(intnValue);privateIncreaseHandlemyIncrease=null;privatevoidShowProcessBar(){myProcessBar=newForm2();myIncrease=newIncreaseHandle(myProcessBar.Increase);myProcessBar.Show();myProcessBar=null;}privatevoidScanFile(){StreamReaderaFile=newStreamReader(path1,System.Text.Encoding.Default);Stringname=Path.GetFileName(path1);Stringrole1=@"绝.*密";Regexreg1=newRegex(role1);MethodInvokermi=newMethodInvoker(ShowProcessBar);this.BeginInvoke(mi);Thread.Sleep(1000);objectobjReturn=null;while(aFile.Peek()>=0){Thread.Sleep(1);objReturn=this.Invoke(this.myIncrease,newobject[]{2});stringline=aFile.ReadLine();if(reg1.IsMatch(line)){MessageBox.Show("该文档涉密",name);return;}}MessageBox.Show("该文档不涉密",name);}privatevoidbutton1_Click(objectsender,EventArgse){OpenFileDialogofd1=newOpenFileDialog();ofd1.FileName="";ofd1.InitialDirectory=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);ofd1.Filter="文本文件(*.txt)|*.txt";ofd1.ValidateNames=true;ofd1.CheckPathExists=true;ofd1.CheckFileExists=true;if(ofd1.ShowDialog()==DialogResult.OK){textBox1.Text=ofd1.FileName;path1=textBox1.Text;}}privatevoidtextBox2_TextChanged(objectsender,EventArgse){}publicvoidbutton2_Click(objectsender,EventArgse){ThreadStartscanStart=newThreadStart(ScanFile);Threadscaning=newThread(scanStart);scaning.Name=path1;scaning.IsBackground=true;scaning.Start();}privatevoidForm1_Load(objectsender,EventArgse){}}}

谢谢大家乐

解决方案

解决方案二:
是不是代码哪地方写错了,仔细检查检查!
解决方案三:
自己顶一个,真的是有问题不会,不是自身代码敲错的问题,大神们帮我看看吧
解决方案四:
大哥,发的代码加点注释呀,读的太费劲了privatevoidShowProcessBar(){myProcessBar=newForm2();myIncrease=newIncreaseHandle(myProcessBar.Increase);myProcessBar.Show();myProcessBar=null;}

问题出在这
解决方案五:
Form2A=newForm2();第一个Form2是个类型定义A是指针(存类型分配的内存的首地址)newForm2()是让系统分配一块内存A=newForm2()就是把这块内存的地址存在A的变量里,你就可以用了——————————————————————A=newForm2();A=newForm2();A=newForm2();感觉是一样的吧,但三个newForm2()不是一个东西,是三块内存。上面三行执行完后,A里存的是最后的那块内存的地址。所以你的更新全在最后的那个窗口里
解决方案六:
改一下privateForm2myProcessBar=null;--这个不行privateDictionary<string,Form2>myProcessBar=newDictionary<string,Form2>();privateDictionary<string,IncreaseHandle>myIncrease=newDictionary<string,IncreaseHandle>();privatevoidShowProcessBar(stringname){myProcessBar[name]=newForm2();myIncrease[name]=newIncreaseHandle(myProcessBar[name].Increase);myProcessBar[name].Show();}privatevoidScanFile(){StreamReaderaFile=newStreamReader(path1,System.Text.Encoding.Default);Stringname=Path.GetFileName(path1);MethodInvokermi=newMethodInvoker(ShowProcessBar);//这块加参数,把name传进去//…………………………………………while(aFile.Peek()>=0){Thread.Sleep(1);objReturn=this.Invoke(this.myIncrease[name],newobject[]{2});//这块有变动stringline=aFile.ReadLine();if(reg1.IsMatch(line)){MessageBox.Show("该文档涉密",name);return;}}MessageBox.Show("该文档不涉密",name);}

大概是这样,你试一下

时间: 2024-10-02 18:17:15

关于C#多线程进度条的问题的相关文章

qt-QProgressBar 不动,多线程实现进度条

问题描述 QProgressBar 不动,多线程实现进度条 class ProcDlg : public QRunnable { public: ProcDlg(QProgressBar* progressBar); void run(); void setVal(int val); private: QProgressBar* m_ProgressBar; int m_val; }; ProcDlg::ProcDlg( QProgressBar* progressBar) { m_Progre

Android编程开发实现带进度条和百分比的多线程下载

本文实例讲述了Android编程开发实现带进度条和百分比的多线程下载.分享给大家供大家参考,具体如下: 继上一篇<java多线程下载实例详解>之后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java: package com.example.downloads; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.H

Android多线程+单线程+断点续传+进度条显示下载功能

效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum

C# 多线程控制进度条进度

问题描述 我想要一个2个线程,一个线程控制方法执行,方法执行的时间就是另一个进程控制进度加载的速度.求实例. 解决方案 解决方案二:你这里的"线程"的概念本身就是"坑"的.你这样滥用线程概念,若遇不太关心技术的团队,以后制造出来的问题将很多.在一个计算任务中,如果要设置进度条,写一条类似这样的代码this.progressBar1.BeginInvoke((Action)delegate{this.progressBar1.Value=20;}); 就可以了.(当然

Android ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

http://www.cnblogs.com/chon/archive/2011/06/28/2092317.html Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原因在于它的高效(如何实现的?).ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xm

java Swing 进度条 多线程问题 附代码

问题描述 目标:当我点击主界面上的开始按钮,然后就会用大约1分钟来进行数据处理.但是在数据处理的时候,整个软件就像死了一样(其实没有),刷新还在继续,所以我想达到这样的效果:点击开始按钮,就弹出一个进度条在不停的动,表示程序正在运行,并没有死,然后进度条在持续更新,从1%到100%,当数据处理结束时,进度条消失,显示主界面,怎么实现呀!望大家处处注意!谢谢!问题:程序无法实现[处理中]对话框进度条与数据处理同步开始的功能.如何使他们同步进行?即:数据处理一开始,就让进度条对话框弹出,且从0%开始

详细解析JSP编程中进度条的设计实例

js|编程|设计 许多Web应用.企业应用涉及到长时间的操作,例如复杂的数据库查询或繁重的XML处理等,虽然这些任务主要由数据库系统或中间件完成,但任务执行的结果仍旧要借助JSP才能发送给用户.本文介绍了一种通过改进前端表现层来改善用户感觉.减轻服务器负载的办法. 当JSP调用一个必须长时间运行的操作,且该操作的结果不能(在服务器端)缓冲,用户每次请求该页面时都必须长时间等待.很多时候,用户会失去耐心,接着尝试点击浏览器的刷新按钮,最终失望地离开. 本文介绍的技术是把繁重的计算任务分离开来,由一

实现无刷新的进度条功能(采用xmlhttp技术)

xml|刷新|无刷新 我这里采用xml技术来实现进度条的功能,我这里假设加上有几个运行量非常大的存储过程,执行每一个所需要消耗的时间都很久,这里在页面上显示进度条功能,每执行完一个存储过程,进度条就向前前进一步,这样子用户采用感觉到系统还在运行中. 实现进度条的方法有好几种,可以采用多线程的方式,也可以采用iframe的方式.这两种方式都有缺陷,采用多线程的方式有很多弊端,比如耗资源,会产生明显的刷新效果.而iframe不会产生刷新效果,但是每次刷新都会发出一个刷新声,如果进度条频繁刷新的话,刷

ASP.NET技巧:教你制做Web实时进度条

asp.net|web|技巧 网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个Session,当任务进行到不同的阶段改变Session的值,线程开始的同时使用ShowModalDialog打开一个进度条窗口,不断刷新这个窗口获取Session值,反应出实时的进度.下面就来看看具体的代码:(文章结尾处下载源代码) 先新建一个Default.aspx