首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于delphi 中 WaitForSingleObject函数的运用

2013-07-08 
关于delphi 中 WaitForSingleObject函数的使用我在编写一个程序的时候遇到 这样的问题简述吧dll B 注入到

关于delphi 中 WaitForSingleObject函数的使用
我在编写一个程序的时候遇到 这样的问题
简述吧
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 多线程 性能优化


[解决办法]
type
  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;

热点排行