用多线程进行扫描,CPU资源占有非常厉害,怎么解决? ( 积分: 100 )

  • 主题发起人 主题发起人 孤云
  • 开始时间 开始时间

孤云

Unregistered / Unconfirmed
GUEST, unregistred user!
用多线程来进行循环扫描
procedure TA.Execute;
begin
while truedo
begin
IF Terminated then
Break;
.....
Synchronize(DoScanA);
........

end;
end;

procedure TA.DoScanA;
begin
while a=truedo
begin
............
...........
//由于a在一定时间范围内基本为true,所以会在不断的进行扫描,而且这个扫描必须不断进行的,调试后发现CPU资源占用非常大,基本上陷入死循环了,请问该怎么解决?请大虾帮帮忙,谢谢!
end;

end;
 
占CPU最多的是DoScanA过程吗?
如果是,你干嘛用Synchronize(DoScanA)?
Synchronize(DoScanA)就把DoScanA过程放在主线程环境中执行了,不合情理啊
 
应该是的,因为调试到这个地方的时候资源总是占用很大
 
请问那应该怎么用?
直接DoScanA就可以?
请指点!!谢谢!
 
DoScanA如果不要写入主线程的资源,如界面控件赋值,就不要同步。。。
直接调用。
 
刚才在全文检索里看了一些Synchronize的帖子
我属于滥用Synchronize的那种
呵呵
谢谢各位!
 
procedure TA.DoScanA;
begin
while a=truedo
begin
............
...........
//由于a在一定时间范围内基本为true,所以会在不断的进行扫描,而且这个扫描必须不断进行的,调试后发现CPU资源占用非常大,基本上陷入死循环了,请问该怎么解决?请大虾帮帮忙,谢谢!
Sleep(10);//看看CPU会不会少点.呵呵
end;

end;
 
同为初学者,我觉得在子线程结束或者开始的时候加一下 Sleep(50) 比较好。
你可以试一下 前几天我做的一个服务就是这样实现的。嘿嘿
 
只有在线程里的操作涉及到界面的vcl时才用Synchronize,否则的话还是别用的好!
 
线程里不要Sleep。。。
不然就不叫线程了。。。
想想线程的概念就知道了,系统会自动调度的,要你来Sleep干嘛
 
能解决问题就OK,不要拘泥与线程与非线程.
 
只有涉及界面操作的时候才需要同步!你目前的问题不需要同步!
 
后退
顶部