十三个线程,CPU使用率100%如何解决?

wxyf3222 2008-03-17 10:55:18
1:服务器程序手工启动十三个线程,运行时CPU使用率基本上达到100%。
请问各位高手,这个问题该如何解决?

2://读取PLC数据
private void ReadPLC1Data(object StateInfo)
{
while (RdadPLC1DataState)
{
try
{
TV1PLCCtrl.ReadToDB(ConnectString, "MOTION_MESSAGE", "GENERAL_MESSAGE", "STATUS_MESSAGE");
Thread.Sleep(ThreadWaitTime);
}
catch
{
Thread.Sleep(ThreadWaitTime);
}
}
}
这个方法基本上是个死循环,能否放到线程池中执行?如果不行,定义为System.Threading.Timer行不行?(同类的操作有8个,CPU使用率同样达到100%,该如何降下来?)
烦请各位帮忙解决。
...全文
508 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxyf3222 2008-03-28
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 hopewoo 的回复:]
你应该建立一个等待环节,就像某些游戏登陆过程中,会提示你正在登陆,其实后台(指线程)里在做很多操作,加载地图啊==
还有不要随便提高线程优先级,最好是降低线程的优先级.
[/Quote]
呵呵,既提且降,再加个等待环节,好办法,本人第一次做这样的项目,成功了也是各位的功劳.
再次感谢大家的鼎力相助.结贴.
yhy0611 2008-03-28
  • 打赏
  • 举报
回复
大家的意见都不错。我也没啥说的了,接分吧

Thread.Sleep休眠时间长一点

硬件也尽量提高一下吧
hopewoo 2008-03-28
  • 打赏
  • 举报
回复
系统运行起来,界面的响应速度很慢
---这个问题,不能够单单的靠提高优先级来解决今天你3.0G双核主线程优先级提高后响应速度是快了很多,但是如果换成1.5G单核你怎么办.再高的优先级也没3.0G双核的普通优先级来的快吧?
你应该建立一个等待环节,就像某些游戏登陆过程中,会提示你正在登陆,其实后台(指线程)里在做很多操作,加载地图啊==
还有不要随便提高线程优先级,最好是降低线程的优先级.
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
也谢谢boblaw 黑马王子‧偷回忆的人 对我的大力帮助.
本人郑重声明,结贴时100分将奉给boblaw.
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 r_swordsman 的回复:]
TV1PLCCtrl.ReadToDB(ConnectString, "MOTION_MESSAGE", "GENERAL_MESSAGE", "STATUS_MESSAGE");
/// 应该共用数据库链接
[/Quote]
请问你的意思是不是线程启动后在while (RdadPLC1DataState){}里只连接一次数据库?这是个很好的建议,不过如果这个连接持续半年,会不会出问题?
boblaw 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wxyf3222 的回复:]
兄弟姐妹们,帖子加了100分了,盼求解救。
还有,系统运行起来,界面的响应速度很慢,如何提高主窗口线程的优先级?
[/Quote]
在主線程中執行如下代碼
Thread.CurrentThread.Priority = ThreadPriority.Highest;
r_swordsman 2008-03-27
  • 打赏
  • 举报
回复
TV1PLCCtrl.ReadToDB(ConnectString, "MOTION_MESSAGE", "GENERAL_MESSAGE", "STATUS_MESSAGE");
/// 应该共用数据库链接
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
谢谢 19 楼 hopewoo 的提醒,这个问题我大意了.
hopewoo 2008-03-27
  • 打赏
  • 举报
回复
不要在线程中使用主线程中定义的TV1PLCCtrl对象,你在开线程时把TV1PLCCtrl传进去,在线程里面使用传进来的TV1PLCCtrl对象.
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 chengqscjh 的回复:]
这个感觉上要看程序的通信机制了,不行加cpu提高处理速度
[/Quote]
程序的通信机制是监控程序通过OPC服务器和PLC进行通信。
现场运行时监控程序安装在四核的服务器上。
还有如何提高界面响应速度?设置主线程的优先级?
chengqscjh 2008-03-27
  • 打赏
  • 举报
回复
耗CPU的操作是dll控件和PLC之间的通信
-------------------------------
这个感觉上要看程序的通信机制了,不行加cpu提高处理速度
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
现在线程数目已经压到最少了,没有办法再精简了。
问题是如何提高界面响应速度?
wxyf3222 2008-03-27
  • 打赏
  • 举报
回复
兄弟姐妹们,帖子加了100分了,盼求解救。
还有,系统运行起来,界面的响应速度很慢,如何提高主窗口线程的优先级?
wxyf3222 2008-03-26
  • 打赏
  • 举报
回复
自己顶一下
wxyf3222 2008-03-26
  • 打赏
  • 举报
回复
各位高手还在吗?问题已经找到,耗CPU的操作是dll控件和PLC之间的通信。
请问在dll中能否加Thread.Sleep()?
如果不能加,有什么好的办法解决这个问题?
fuda_1985 2008-03-17
  • 打赏
  • 举报
回复
学习
wxyf3222 2008-03-17
  • 打赏
  • 举报
回复
我再试试,多谢了。
boblaw 2008-03-17
  • 打赏
  • 举报
回复
把sleep時間稍微放長點應該不會對你的線程的工作有太大的影響,稍微放長一點,就會讓CPU的壓力有所緩解。
boblaw 2008-03-17
  • 打赏
  • 举报
回复
你要知道,無限循環,必然是耗CPU的
可以設置線程優先級為ThreadPriority.Lowest,效果應該不會明顯。
衹能Thread.Sleep能夠真正緩解。

[Quote=引用 4 楼 wxyf3222 的回复:]
请问boblaw:想辦法暫時中止一下,你的意思是不是在线程中多加几个Thread.Sleep()?
[/Quote]
用不著很多,把Sleep的時間稍微放長點就好。
wxyf3222 2008-03-17
  • 打赏
  • 举报
回复
多谢5楼兄弟的提醒,你的意思是不管线程多少,只要把消耗资源的线程分解得小一点,这个问题就解决了吗?
加载更多回复(6)

110,536

社区成员

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

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

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