C# 线程池 子线程进度条监控问题

huiaiyun7 2013-12-24 10:38:17
代码如下:

ThreadPool.SetMaxThreads(groupMaxThreads, groupMaxThreads);//设置线程池排队最大值
Hashtable htpars = null;
for (int i = 0; i < Groupmax; i++) 遍历开启线程池
{
htpars = new Hashtable() ;
htpars["G"] = i + 1;
htpars["even"] = enevNum;
htpars["Yhindex"] = Yhstartindex;
ThreadPool.QueueUserWorkItem(new WaitCallback(insertdate), htpars); //
}

while (true) //循环检测子线程是否执行完毕
{
Thread.Sleep(10);//这句写着,主要是没必要循环那么多次。去掉也可以。
int maxWorkerThreads, workerThreads;
int portThreads;
ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads);
ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);

if (maxWorkerThreads - workerThreads == 0) //判断子程序有没有全部运行结束
{
break;
}
}
我该如何用progressBar来显示子线程完成的几个的百分比呢?这边百分比 percent= workerThreads /maxWorkerThreads 就可以我觉得,但是该如何用进度调空间显示出来呢,请各位大侠帮忙支招....
...全文
317 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
huiaiyun7 2013-12-25
  • 打赏
  • 举报
回复
终于解决了.....哇哈哈
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
没人回复吗?都准备过圣诞节了......哎
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
自己先顶一下.
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
delegate void ShowProgressDelegate(string currentStep) ; delegate void ShowProgressDelegate_ivokl(string currentStep); ThreadPool.SetMaxThreads(groupMaxThreads, groupMaxThreads);//设置线程池排队最大值 Hashtable htpars = null; for (int i = 0; i < Groupmax; i++) 遍历开启线程池 { htpars = new Hashtable() ; htpars["dele"] = new ShowProgressDelegate(SRT_demo); htpars["G"] = i + 1; htpars["even"] = enevNum; htpars["Yhindex"] = Yhstartindex; ThreadPool.QueueUserWorkItem(new WaitCallback(insertdate), htpars); // } while (true) //循环检测子线程是否执行完毕 { Thread.Sleep(10);//这句写着,主要是没必要循环那么多次。去掉也可以。 int maxWorkerThreads, workerThreads; int portThreads; ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); if (maxWorkerThreads - workerThreads == 0) //判断子程序有没有全部运行结束 { break; } } private static void insertdate(object group) { //Thread.Sleep(1000); Hashtable ht = group as Hashtable; int intgroup = int.Parse(ht["G"].ToString()); ShowProgressDelegate test = ht["dele"] as ShowProgressDelegate; test("组"+intgroup.ToString()+"完成!"); StringOP.WriteLog("\r\n" +"组"+intgroup.ToString()+"完成!" ); } //显示线程处理结果的函数(用于处理线程返回数据),调用异步委托 private void SRT_demo(string OutPutHT) { try { Invoke(new ShowProgressDelegate_ivokl(SRT_demo_Invoke), OutPutHT ); } catch (Exception ex) { StringOP.WriteLog("委托回调错误:" + ex.ToString()); } } /处理非线程创建的控件 private void SRT_demo_Invoke(string OutPutHT) { richTextBox1.AppendText(OutPutHT + Environment.NewLine); } 为什么委托不执行,而且主程序进图死循环了,望高手指点一下。
  • 打赏
  • 举报
回复
不是很严密的话,可以像7#那样弄个int保存完成的数,完成一个+1,并且触发progressBar的ProgressChanged事件,更新进度条位置 进度=(float)当前完成的数/排队的子线程总数 * 100
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
引用 10 楼 much0726 的回复:
直接在子线程里面来委托显示进度条比较容易些。
如果再子线程里面设置了委托,是不是还要在主线程设置一个static值,来计算已经完成了几个线程...?在线程内部有办法知道线程池已经完成了几个线程了吗?
much0726 2013-12-24
  • 打赏
  • 举报
回复
直接在子线程里面来委托显示进度条比较容易些。
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
引用 8 楼 xiaozhu39505 的回复:
你这个不靠谱,线程池你这个程序都在使用的。 ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); 得到的线程计数不准确 理论上最大线程数可以设置得很大,实际运行的时候,线程开到2000个左右,再有新线程就会处于等待状态,不会开始运行。所以你GetAvailableThreads可能会一直得到一个很小的数值
有道理.....忽略了这个问题了..看来还是得用 WaitHandle.WaitAll 方法, 进度条该怎么加进去呢?子程序运行完成进度...
飞小猪 2013-12-24
  • 打赏
  • 举报
回复
你这个不靠谱,线程池你这个程序都在使用的。 ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); 得到的线程计数不准确 理论上最大线程数可以设置得很大,实际运行的时候,线程开到2000个左右,再有新线程就会处于等待状态,不会开始运行。所以你GetAvailableThreads可能会一直得到一个很小的数值
WM_JAWIN 2013-12-24
  • 打赏
  • 举报
回复
ThreadPool.QueueUserWorkItem(delegate(object s)
        {
try{
insertdate(s);}finally { done++; }
        },  htpars);
多加一个,计数。在程序
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
引用 5 楼 KarasCanvas 的回复:
楼主的方法不靠谱的,线程池是整个应用程序都在用的。
没明白什么意思哈.....
种草德鲁伊 2013-12-24
  • 打赏
  • 举报
回复
楼主的方法不靠谱的,线程池是整个应用程序都在用的。
huiaiyun7 2013-12-24
  • 打赏
  • 举报
回复
引用 3 楼 feiyun0112 的回复:
进度调空间.max=maxWorkerThreads 进度调空间.value=workerThreads ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
不行啊,有线程阻塞,得异步调用....但是通过一般的一部调用方法不好用,也可能是我的写法不对..
feiyun0112 2013-12-24
  • 打赏
  • 举报
回复
进度调空间.max=maxWorkerThreads
进度调空间.value=workerThreads

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧