※※※※◆◆ 难题!!! CPU 占用100%,该如何解决 ◆◆※※※※

postren 2004-11-18 09:35:11
我的程序中有ADO(MDAC 2.80)对Sybase数据库(11.9.2)的操作,也有多个线程
在运行了N久时间后(N不确定)占用CPU 100%,系统Windows 2000 Server,Delphi 6

难道还有什么情况会导致CPU 100%的问题??

声明:
1。 我在所有的线程中都有Sleep(1),另外,为了调试我在所有的循环
(包括while和for,只用了这两种循环)中都添加了Sleep(1),可问题依旧存在
2。 对数据库的操作有线程之间的互斥
...全文
633 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
postren 2004-12-22
  • 打赏
  • 举报
回复
应该确定是IdFtp控件的问题,现在把IdFtp控件去掉了,改为Windows API直接操作Ftp,再没有发现类似的问题,揭帖
postren 2004-12-14
  • 打赏
  • 举报
回复
TO:修罗
1. 所有的线程都是有事做的时候做事,没事做的时候Sleep(1分钟),而在占用100%的时候基本上没有做什么事。

2. 线程中的对象为静态创建

leilu 2004-12-14
  • 打赏
  • 举报
回复
帮忙看看http://community.csdn.net/Expert/topic/3642/3642476.xml?temp=.4099237吧,我也遇到些问题。
WGYKING 2004-12-08
  • 打赏
  • 举报
回复
还有就是线程对ADO操作需CoInitialize/CoUnInitialize
虽然有时它不抛出异常
但是运行结果往往是不正确的
WGYKING 2004-12-08
  • 打赏
  • 举报
回复
不排除INDY控件的BUG(我也发现很多……)
用SLEEP无法很好地解决问题

个人猜测:
1。所有线程是否一直处于运行状态?(合理的暂停)
2。线程是否有对象动态创建?(INDY控件创建时最好设置它的OWNER为APPLICATION,而不是NIL/Self)
3。想不出来的……
postren 2004-12-08
  • 打赏
  • 举报
回复
没有用TIdFtp控件的吗?嘿嘿
postren 2004-12-07
  • 打赏
  • 举报
回复
初步判断可能为TIdFtp控件的问题,有哪位兄弟使用过这个控件吗?
postren 2004-12-03
  • 打赏
  • 举报
回复
还没有解决,继续UP,看看有没有更好的答案
superyys 2004-12-03
  • 打赏
  • 举报
回复
我还遇到一个更郁闷的问题,线程在打开oracle数据库的同时(运行在dataset.open),我要用主线程craeate form(Form:=TFormA.Create(nil)),可是一直要等线程运行完了,主线程才能创建出那个窗体.如果主线程不创建窗体,鼠标点界面是有反应的,
有没有谁遇到过这种情况啊?
怎么解决?

我用的是Adoquery控件打开oracle数据库.
待创建的TFormA中使用了dev控件,我怀疑是dev控件的BUG,因为跟踪时,老是在dev控件的源码里运行,跳不出来,反正只要等线程一运行完,就可创建TFormA的实例了.
postren 2004-12-02
  • 打赏
  • 举报
回复
正在 屏蔽所有的线程代码,一个一个的开启调试
ningkq 2004-11-30
  • 打赏
  • 举报
回复
操作数据库的时候没加NEXT,哈哈
birdhaha 2004-11-30
  • 打赏
  • 举报
回复
这样测试,先把所有的线程关了,让其运行一天看问题是否出现,如果没出现,就一定是你线程的问题,如果出现了,就可以不用管线程的for了。
zwjchina 2004-11-28
  • 打赏
  • 举报
回复
知道可能会出问题而又不知道什么时候会出问题最麻烦了,调试都不好调试!

只能这样了,先屏蔽所有的线程代码,一个一个的开启调试!
postren 2004-11-28
  • 打赏
  • 举报
回复
再Up一次
postren 2004-11-27
  • 打赏
  • 举报
回复
有这么多的兄弟在帮小虫想办法,再加100分
线程一共有不到20个,其中8个是我主动启动的,另外的是数据库控件内部启动的
CPU占用100%的时候不确定,现在没有找到问题的原因,已经连续运行了两天还没有出现问题
只能等了

我现在添加了许多的日志记录,把什么时候进入线程、进入哪个线程以及什么时候进入临界区和释放临界区都做了日志记录,另外,把CPU的占用率、内存大小、线程数量、句柄数量等(差不多任务管理器中能看到的都做了详细的日志记录),但愿下次出现问题的时候能找到问题的所在
fashi1000 2004-11-27
  • 打赏
  • 举报
回复
全部挂起,,每次运行一个线程,循环循环在循环,给它几个小时跑个够
等吧所有线程试遍了,估计你就知道是谁在吃CPU了. 最起码也知道是不是线程的问题
方法太笨了,你看这办吧 有时间就试试
gemouzhi 2004-11-27
  • 打赏
  • 举报
回复
你用了多少线程?
而且 你把sleep过短,sleep(200)

不过我估计你的问题不在这里,
你是不是线程没有释放,你在服务器端线程create和destroy的时候你记录一下
线程的个数!

beyondtkl 2004-11-27
  • 打赏
  • 举报
回复
我碰到过这个问题 同时打开5000个SOCK控件 系统就占用了100% 还假死机状态

???
汗。。。恐怖。。
梁颖智 2004-11-27
  • 打赏
  • 举报
回复
sleep 没用 加个时间控件 在你循环里面加 这样就好了

我碰到过这个问题 同时打开5000个SOCK控件 系统就占用了100% 还假死机状态

试试吧 5纳秒等待就可以了
beyondtkl 2004-11-27
  • 打赏
  • 举报
回复
大哥 还没搞定? ^_^

只能顶了...
加载更多回复(40)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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