线程占用Cpu资源的问题!(30分)

  • 主题发起人 主题发起人 zzandyzh
  • 开始时间 开始时间
Z

zzandyzh

Unregistered / Unconfirmed
GUEST, unregistred user!
//线程单元
unit Mythread;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,IdHTTP;
type
FThread = class(TThread)
private
idhttp:tidhttp;
number:integer;
url:string;
zt:string;
PaR:string;
protected
Procedure seturl;{ Private declarations }
procedure addzt;
procedure addwz;
procedure Execute;
override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy;override;
end;

implementation
uses unit1;
constructor Fthread.Create(CreateSuspended: Boolean);
begin

IdHttp:=TIdHttp.Create(nil);
idhttp.ConnectTimeout:=20000;
Inherited Create(CreateSuspended);
FreeOnTerminate:=True;//当线程终止时自动销毁线程对象
end;

destructor Fthread.Destroy;
begin
IdHttp.Disconnect;
IdHttp.Free;
inherited;
end;

procedure Fthread.seturl;
var
i:integer;
begin
url:=form1.memo1.Lines.Strings[minnum];
minnum:=minnum+1;
form1.statusbar1.Panels.Items[1].Text:='已检测'+inttostr(minnum)+'个地址' ;
form1.ProgressBar1.Position:=minnum;
end;

procedure Fthread.addzt;
var
aa:integer;
begin
if trim(par)<>'0' then
form1.Memo13.Text:=form1.Memo13.Text+#13#10+(url);
try
aa:=strtoint(trim(par)) ;
except
beep
end;
case aa of
0: form1.Memo3.text:=form1.Memo3.Text+#13#10+(url);
1: form1.Memo2.text:=form1.Memo2.Text+#13#10+(url);
2: form1.Memo4.text:=form1.Memo4.Text+#13#10+(url);
3: form1.Memo5.text:=form1.Memo5.Text+#13#10+(url);
4: form1.Memo6.text:=form1.Memo6.Text+#13#10+(url);
5: form1.Memo7.text:=form1.Memo7.Text+#13#10+(url);
6: form1.Memo8.text:=form1.Memo8.Text+#13#10+(url);
7: form1.Memo9.text:=form1.Memo9.Text+#13#10+(url);
8: form1.Memo10.text:=form1.Memo10.Text+#13#10+(url);
9: form1.Memo11.text:=form1.Memo11.Text+#13#10+(url);
10: form1.Memo12.text:=form1.Memo12.Text+#13#10+(url);
end;

end;

procedure Fthread.addwz;
begin
form1.memo14.Text:=form1.memo14.Text+#13#10+(url);
end;

procedure fThread.Execute;
const
baseurl='http://soft.baofe.com/k.asp?url=' ;
var
html:string;
Params: TStrings;
p1,p2: Integer;
begin

while (not terminated)and(minnum<=maxnum)do
begin
application.ProcessMessages ;
sleep(1);
if form1.CheckBox1.Checked then
begin
idhttp.ProxyParams.ProxyServer:=form1.Edit5.Text;
idhttp.ProxyParams.ProxyPort:=strtoint(form1.Edit6.text);
end;

Synchronize(seturl);
try
HTML:=IdHttp.get(BaseURL+url);
except
synchronize(addwz);
idhttp.Disconnect;
end;

p1:=pos('style',html);
par:=copy(html,p1+length('red'),1);
synchronize(addzt);
end;

end;

end.

//调用单元
procedure TForm1.Button1Click(Sender: TObject);
var
j,maxthread:integer;
begin
isend:=false;
progressbar1.Min:=0;
progressbar1.Max:=memo1.Lines.Count;
progressbar1.Step:=1;
//button1.Enabled :=true;
maxthread:=strtoint(edit1.text);
minnum:=0 ;
maxnum:=memo1.Lines.Count-1;
for j:=0 to maxthread-1do
begin
n:=Fthread.Create(true) ;
n.FreeOnTerminate:=true;
n.Resume;
end;
end;

程序运行时Cpu占用了100%,而且运行不到一小时,程序运行的很慢,比不用多线程还慢,
请大家给看看!
还有就是怎么才能暂停、继续、停止线程!
下边是我的暂停、继续和停止代码,但不起任何作用!
procedure TForm1.Button3Click(Sender: TObject);
begin
if button3.Caption='暂停' then
begin
button3.Caption :='继续';
if n.Suspended then
begin
n.Resume ;
end;
end
else
begin
button3.Caption :='暂停';
if n.Suspended=false then
begin
n.Suspend;
end;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
n.Terminate;
end
 
sleep(1);好恐怖,抢占式多任务就是谁在干活就分配给谁。设时间长一点试试,而且你这儿还有同步代码。
 
不行啊,我设成Sleep(10000)都一样!我感觉不是Sleep的问题
 
问题出在这一句上。不用这句就快了。
Synchronize(seturl);
 
To jingzux
如果不用Synchronize(seturl);这一句,那URl地址怎么处理?
程序刚启动时运行也很快,但过上一会就会慢下来,当地址超过10000,越到后边越慢!系统资源也占用的一光二净!
 
除非在多核处理器或多处理器系统执行.否则多线程不会提升你的程序执行效率的.
学过操作系统就知道了.
 
使用多线程不一定都是为了提高效率吧。
还有其他方面的需要也要使用线程啊。
 
经过测试,我觉得是Memo控件的问题,因为程序要不停的刷新Memo,所以Cpu资源会慢慢被占光了!请问大家,怎么解决?还有就是暂停、继续、停止怎么写?
 
可以考虑使用文件吧,内容不多的时候使用memo,内容太多,而又想保留内容的,最好使用文件形式。
 
to jamcky
但我想也能在Memo中看到结果,用什么好的方法,能使Memo占用少的资源!
还有,如何使用文件处理?
 
保持memo中的行数就可以了,其他的我没什么好办法——windows的图形处理问题
 
问题大家都已经解决清楚了,
Synchronize(seturl);这句的问题,造成效率十分的低下,但也有好处
你把这段用临界区来括住就可以了
EntercriticalSection(Lock);
form1.memo14.Text:=form1.memo14.Text+#13#10+(url);
LeaveCriticalSection(Lock);
就可以了
 
并非多线程就可以提高性能,当线程数达到一定数量时,由于操作系统要将大量的时间用于线程调度(包括比较优先级和保存和重新获取执行线程的堆栈信息),性能会反而下降。
 
首先,适当的线程是可以明显提高效率的,不需要争辩.
你哪个问题可以使用异步消息的方法提高效率,但有个问题,就是缓冲的管理,一种方法是线程建立,消息回调过程释放,一种使用缓冲池,你自己看着办,
将Synchronize换成PostMessage然后在主线程中处理那个Memo.可大幅降低对CPU的占用,而且效率不低.
随便说一句,你哪个Memo一万多条了你还不清空,程序离死也不远了,Memo的Buffer是有限制,具体忘了是多少好象是65535.
 
后退
顶部