多线程的程序虽好但,很占资源。不知道为什么(20分)

  • 主题发起人 主题发起人 ulingjcj
  • 开始时间 开始时间
U

ulingjcj

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMainForm = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;
implementation
uses ThrdU;
{$R *.DFM}
procedure TMainForm.Button1Click(Sender: TObject);
begin
TTestThread.Create(False);
end;

end.

unit ThrdU;
interface
uses
Classes;
type
TTestThread = class(TThread)
private
Answer: integer;
protected
procedure GiveAnswer;
procedure Execute;
override;
end;

implementation
uses SysUtils, Main;
{ TTestThread }
procedure TTestThread.GiveAnswer;
begin
MainForm.Edit1.Text := InttoStr(Answer);
end;

procedure TTestThread.Execute;
var
I: Integer;
begin
FreeOnTerminate := True;
for I := 1 to 2000000do
begin
if Terminated then
Break;
Inc(Answer, Round(Abs(Sin(Sqrt(I)))));
Synchronize(GiveAnswer);
end;
end;

end.

这是最简单的一个多线程程序,但运行时却点了80%以上的CPU。不知道是否有其它的解决方法
 
最好用消息来驱动,勉强的解决方法
for I := 1 to 2000000do
begin
if Terminated then
Break;
Inc(Answer, Round(Abs(Sin(Sqrt(I)))));
Synchronize(GiveAnswer);
sleep(10);
end;
 
把线程的优先权设低一点。
 
运行几个循环就 suspend ;
在 Timer 里 resume
 
不应该让线程持续运行,应该让它有点休息的时间。
在循环中加上sleep(50),cpu占用率就会降到10%左右,甚至更低。
 
呵呵。。。让他睡一觉是挻好的:)[:)]
 
个人觉得采用多线程真是为了充分利用CPU并使得主线程能够对用户操作进行响应,因此后台线程运行起来后会占用资源是很正常的,只要不影响主线程或其他的程序运行,即使CPU占用百分百也没有太大关系。不过如果是很费资源的运算,并且对时间的要求不是非常严,可以降低优先级来后台运行。至于是否调用Sleep,个人感觉没有必要,因为现在的Windows都是抢先式的,时间到了自然会把控制权取过来,如果Sleep了反而浪费资源
 
谁说Sleep浪费资源?你有没有搞清楚?Sleep之后,如果没有其它进程或线程需要资源windows就执行ide指令,cpu的耗电量就会下降,温度也会下降。怎么浪费了资源?
如果是一个非常重的任务,让cpu持续工作那是没有办法,如果不是,干嘛要持续工作?
你一天到晚不睡觉,你会觉得节省了资源,你会生活得更好吗?
 
浪费资源只是说浪费了CPU的资源,这段时间中CPU没有运行东西,反而要强制睡眠。即使我说错了也不至于这样生气嘛[:D]。
我就写了一个采用多线程后台刷新数据库的程序,后台线程采用tpLower权限,在刷新数据库的时候等它自己运行去,完了一个回合就睡眠,保证每次刷新的间隔时间为30秒,没有完成工作以前都是全力运行的。
现在我就遇到问题,看你能否给我解决。呵呵
 
怎么会没有运行东西呢?不是在运行线程吗?
你的不也是每30秒刷新而不是时时吗?再说数据库与这些纯计算之类的还是有区别的。
 
我觉得sleep(10),是个好办吧,调节线程的优先级别,实际效果一般
 
这个程序对实时性的要求比较高,如果sleep() 还有实时性吗?
各位,再小弟想想,有没别的办法可以解决这个问题!
 
10-50ms的延迟通常不成问题。如果这也不行,你可以考虑用消息机制。
 
是否占用资源和是否在自己生成的线程中无关,把他们放到主线程中去运行,就知道主线程会怎么占用资源了。呵呵。
如果既不想占用资源,又要求实时性,好像不行吧
 
多人接受答案了。
 
后退
顶部