我在编写一个程序的时候遇到 这样的问题
简述吧
dll B 注入到进程A中 同时 执行A的部分代码(B中三个线程)
为了能够保证程序不出问题 我是调用 B中的按钮事件
procedure Tthread3.Execute;
var
i:Integer;
begin
i:=0;
repeat
i:=i+1; EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button1.click;
Form1.Button3.click;
finally
LeaveCriticalSection(MyCs); //离开临界区
end; //Delay(5);
sleep(5); form1.lbl1.Caption:=IntToStr(i);
until i>100000; //十万次
end;procedure Tthread4.Execute;
var
ii:Integer;
begin
ii:=0;
repeat
ii:=ii+1;
EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button2.click;
Form1.Button3.click;
form1.lbl2.Caption:=IntToStr(ii);
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
// Delay(5);
sleep(5);
until ii>100000;//十万次
end;procedure Tthread5.Execute;
var
iii:Integer;
begin
iii:=0; repeat
iii:=iii+1;
EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button1.click;
Form1.Button2.click;
Form1.Button3.click;
form1.lbl3.Caption:=IntToStr(iii);
finally
LeaveCriticalSection(MyCs); //离开临界区
end; sleep(5);
until iii>100000;//十万次
end;procedure TForm1.btn1Click(Sender: TObject);
begin
ceshi1:=Tthread3.Create(False);
end;procedure TForm1.btn2Click(Sender: TObject);
begin
ceshi2:=Tthread4.Create(False);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
ceshi3:=Tthread5.Create(False);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSectionAndSpinCount(MyCs,400); //这个函数不错 性能彪升。end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(MyCs);end;end.因为执行的是 10w次的循环 所以CPU占用很高
四核的 占了 25%左右
我想用比较好的延时 实现 速度很快的同时 占用CPU很少 (1%以内吧)
我翻阅了资料 有些人觉得WaitForSingleObject 可以实现
我也不知道怎么做才可以 求高手 指点下
要求就是 尽可能 最快的执行完 上述 循环 占用CPU少。
而且要求 程序不要无响应 不卡死,我的代码 因为用了 多线程的协调 本身是不会 冲突的。执行完 全部的循环没问题。
Delphi多线程性能优化
简述吧
dll B 注入到进程A中 同时 执行A的部分代码(B中三个线程)
为了能够保证程序不出问题 我是调用 B中的按钮事件
procedure Tthread3.Execute;
var
i:Integer;
begin
i:=0;
repeat
i:=i+1; EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button1.click;
Form1.Button3.click;
finally
LeaveCriticalSection(MyCs); //离开临界区
end; //Delay(5);
sleep(5); form1.lbl1.Caption:=IntToStr(i);
until i>100000; //十万次
end;procedure Tthread4.Execute;
var
ii:Integer;
begin
ii:=0;
repeat
ii:=ii+1;
EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button2.click;
Form1.Button3.click;
form1.lbl2.Caption:=IntToStr(ii);
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
// Delay(5);
sleep(5);
until ii>100000;//十万次
end;procedure Tthread5.Execute;
var
iii:Integer;
begin
iii:=0; repeat
iii:=iii+1;
EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button1.click;
Form1.Button2.click;
Form1.Button3.click;
form1.lbl3.Caption:=IntToStr(iii);
finally
LeaveCriticalSection(MyCs); //离开临界区
end; sleep(5);
until iii>100000;//十万次
end;procedure TForm1.btn1Click(Sender: TObject);
begin
ceshi1:=Tthread3.Create(False);
end;procedure TForm1.btn2Click(Sender: TObject);
begin
ceshi2:=Tthread4.Create(False);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
ceshi3:=Tthread5.Create(False);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSectionAndSpinCount(MyCs,400); //这个函数不错 性能彪升。end;procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteCriticalSection(MyCs);end;end.因为执行的是 10w次的循环 所以CPU占用很高
四核的 占了 25%左右
我想用比较好的延时 实现 速度很快的同时 占用CPU很少 (1%以内吧)
我翻阅了资料 有些人觉得WaitForSingleObject 可以实现
我也不知道怎么做才可以 求高手 指点下
要求就是 尽可能 最快的执行完 上述 循环 占用CPU少。
而且要求 程序不要无响应 不卡死,我的代码 因为用了 多线程的协调 本身是不会 冲突的。执行完 全部的循环没问题。
Delphi多线程性能优化
Tthread3 = class(Tthread)
private
FEvent: HWND;
procedure aSleep(ms: Word);
public
constructor Create();
destructor Destroy; override;
end;constructor Tthread3.Create;
begin
FEvent := CreateEvent(nil,True,True,nil);
inherited Create(False);
end;destructor Tthread3.Destroy;
begin
if FEvent > 0 then CloseHandle(FEvent);
inherited;
end;procedure Tthread3.aSleep(ms: Word);
begin
ResetEvent(FEvent);
WaitForSingleObject(FEvent,ms);
end;procedure Tthread3.Execute;
var
i:Integer;
begin
i:=0;
repeat
i:=i+1;
EnterCriticalSection(MyCs); //进入临界区
try
Form1.Button1.click;
Form1.Button3.click;
finally
LeaveCriticalSection(MyCs); //离开临界区
end;
//Delay(5);
//sleep(5);
aSleep(5);//个人觉得sleep 5 太短了啊,这是导致CPU占用高的主因,最好sleep大点
form1.lbl1.Caption:=IntToStr(i);
until i>100000; //十万次
end;
sleep高了效率很低
sleep低了 CPU很卡
又要效率 GPU也不能用。
aSleep(5);放在try里面效果比较明显
放在外面不明显
我怀疑是有些 消息没处理完
但是不用消息 程序又容易崩溃
EnterCriticalSection 可以保证不出错
tryEnterCriticalSection速度快了 但是到最后全部线程都会挂掉