关于多进程+多线程方式下的线程状态取得(在线等)

csdn_wangkp 2009-04-30 02:45:39
上周给一个项目写了个多进程+多线程的负荷测试程序。
由于考虑失当,发生了一个错误,导致所有线程停掉了(不是中止状态,似乎是等待状态)。
原因找到了,也解决了。现在我想能不能在外部对每个进程的每个线程状态进行监控。

Process.Threads能取得一个进程的所有线程,但是无法确定哪个是我想要的线程,
而且这里拿到的线程id似乎是系统的唯一id。
在线程内部取得的thread.ManagedThreadId是一个顺序值,与外边取得得唯一id对不上号。

本来在进程或者线程内部加上一个定时发送状态的处理的话,理论上是可以实现的。
但是怕多余的处理会影响负荷测试的结果。只想在需要的时候,比如一个按钮事件,
才去拿一下状态结果,有没有知道做法的朋友指点一下,谢谢。
...全文
355 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
放弃了。

谢谢大家讨论,归根结底还是跟11楼朋友的意见对上了。
另外发帖子问一下 进程之间通信的问题。

pricks 2009-05-01
  • 打赏
  • 举报
回复
那就期待高人出现吧。
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 arlang 的回复:]
不太明白楼主什么意思,有个建议对自己创建的线程可以放在一个数组或List中管理起来
[/Quote]

线程不是ui创建的,这里不是单纯的多线程处理,也不是单纯的多进程处理。
是多进程处理+多线程处理。好好考虑一下实现。

to BiologyPianoProgram'
〉〉将UI作为参数传入线程,在线程中将线程自身映射到这个UI参数中去。

谢谢这么热心参与探讨,不过我觉得你走入误区了,完全想错了。面向对象不是这么用的,也不能这么用。
随便写个简单程序是一下就知道了。
feifeiyiwen 2009-05-01
  • 打赏
  • 举报
回复
谢谢又学了一招
arlang 2009-05-01
  • 打赏
  • 举报
回复
不太明白楼主什么意思,有个建议对自己创建的线程可以放在一个数组或List中管理起来
pricks 2009-05-01
  • 打赏
  • 举报
回复
UI拿不到对线程的引用?

将UI作为参数传入线程,在线程中将线程自身映射到这个UI参数中去。
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
呵呵,关键是ui拿不到线程对象的引用。

可能这个帖子有点长了,有些朋友没有从头看起,
可能有些误解。再简单说明一下。
ui 是个独立的form程序。
process 是独立的console程序。
ui + n个process 相当于n+1个进程。


进程与进程的关系,进程与线程的关系。欢迎所有朋友的意见。批评得也欢迎。
pricks 2009-05-01
  • 打赏
  • 举报
回复
你要解决的问题是:在UI中实现对多个线程的监控。而所谓的监控,亦无非是想获取其中的某些属性。
线程是对象,即:我们只需获取该对象的引用,即可获取该对象的所有属性。

我的意思就是这样。

在UI中保存对线程对象的引用,那么UI便可获取到该线程的所有参数,也就实现了对线程的所谓的监控。

我对线程没有深入研究过,以上的解决方案完全是从面向对象这一前提出发的。

或者,你能告诉我,你所说的监控是想怎么样?
homejiji 2009-05-01
  • 打赏
  • 举报
回复
学习
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 BiologyPianoProgram 的回复:]
编程重要的是思想,而非技术。
C#是面向对象的语言。
线程thread都是一个个的对象。

那么你每开一个新的线程,就可以在new之后,访问UI中的一个临时集合,该集合中储存线程对象;
将该新开的线程复制一份,保存到该集合中;
该集合中便有一个临时克隆对象,其引用指向该新开的线程,它们共享相同的属性。

这样,在UI中便可以通过这些克隆而获取到某一个特定的线程的属性了呀。
[/Quote]

不好意思,还是无法理解。举个不是很恰当的例子,自己写个应用程序,能不能直接操作ieexplorer.exe内部
得线程呢。可以通过被动接受得方式得到别的进程主动发送的信息,直接取得参照引用这个说法怎么都无法理解。

〉〉编程重要的是思想,而非技术。
这句话我明白,但是没有实践证明,思想是不一定正确地,那只是 想法 而已。
pricks 2009-05-01
  • 打赏
  • 举报
回复
编程重要的是思想,而非技术。
C#是面向对象的语言。
线程thread都是一个个的对象。

那么你每开一个新的线程,就可以在new之后,访问UI中的一个临时集合,该集合中储存线程对象;
将该新开的线程复制一份,保存到该集合中;
该集合中便有一个临时克隆对象,其引用指向该新开的线程,它们共享相同的属性。

这样,在UI中便可以通过这些克隆而获取到某一个特定的线程的属性了呀。
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 BiologyPianoProgram 的回复:]
UI是与线程毫无关系
但是线程可以访问到UI。

我的意思就是:在UI与线程之间设置一种映射。
将每一个线程都映射到UI中,这样在UI中根据这种映射关系便可获取某个特定的线程。
[/Quote]

线程可以访问到UI这个没有错,如何做这个映射能详细说说吗?也就是说一个进程如何
直接取得另外一个进程内部的线程得信息。
pricks 2009-05-01
  • 打赏
  • 举报
回复
UI是与线程毫无关系
但是线程可以访问到UI。

我的意思就是:在UI与线程之间设置一种映射。
将每一个线程都映射到UI中,这样在UI中根据这种映射关系便可获取某个特定的线程。
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
15楼的朋友说的使我更糊涂了。
ui负责开n个process,process负责开m个thread,ui跟thread之间毫无关系亚。
全局变量有什么用,这是两个独立的程序(进程)。

11楼的朋友说的确实是一种解决方案,我曾考虑过,只不过控制台程序如何即时接受消息
不是很明白。form程序里重载DefWndProc可以实现。
pricks 2009-05-01
  • 打赏
  • 举报
回复
哈哈,这些人平白无故地就把个简单的事情描述的如此复杂!
真是程序员的悲哀啊!


根据我对楼上各位的描述,
所谓全局缓存进程/线程的引用,无非就是定义个全局的变量而已,
这个变量储存有UI所开的各个线程+进程的状态。

楼主不是说process不能在UI级无法知道各个进程的诸如name属性这些状态吗?
OK,楼上各位所提的方法就是:定义个全局变量,每开一个线程,就保存该线程的某个属性。
这样UI中就可以通过该全局变量获取某一个线程对象,并从而可以获取该线程对象的其他状态了。

万物皆对象。程序的奥妙在于:给我一个对象,我只需知道该对象的哪怕一点点皮毛的信息,我就能够从茫茫对象中准确地抓到这个对象并控制之。
csdn_wangkp 2009-05-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tangyishi 的回复:]
这其实相当与一个进程通讯问题吧。
我给出如下解决方案,供参考:
需要监视的线程启动前,将自己的id及其他信息(如线程ID)保存到文件.这样你另外的进程就可以通过这个文件知道thread id对应哪个线程了
[/Quote]

也可以这么说,用进程通讯的话,当然也可以解决问题。控制台程序如何接受消息,我不是很明白。
用文件的方式,个人认为更不好,额外还多出io处理,那我还不如定时向ui送消息。

另外,好多人提到全局缓存进程/线程的引用,我不是很明白,具体怎么个全局,ui+process+thread
有全局对象吗?
sushou2009 2009-04-30
  • 打赏
  • 举报
回复
推荐全局缓存进程/线程的引用
gxj760998 2009-04-30
  • 打赏
  • 举报
回复
改造下THREAD,加入你说的状态,然后在外部使用全局静态保存thread事例。
tangyishi 2009-04-30
  • 打赏
  • 举报
回复
这其实相当与一个进程通讯问题吧。
我给出如下解决方案,供参考:
需要监视的线程启动前,将自己的id及其他信息(如线程ID)保存到文件.这样你另外的进程就可以通过这个文件知道thread id对应哪个线程了
csdn_wangkp 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cppfaq 的回复:]
楼主不想让工作进程增加额外的工作,那只能用楼上说的全局缓存进程/线程的引用了。
[/Quote]

全局缓存进程/线程,这个观点楼上谁说过吗,我怎么没看见。
能具体说说吗,在我理解 全局 也只是一个process的全局把。

加载更多回复(9)

111,126

社区成员

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

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

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