我在编写一个程序的时候遇到 这样的问题
简述吧
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多线程性能优化

解决方案 »

  1.   

    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;
      

  2.   

    真是一件很冲突的事情
    sleep高了效率很低
    sleep低了 CPU很卡
    又要效率 GPU也不能用。
    aSleep(5);放在try里面效果比较明显
    放在外面不明显
    我怀疑是有些 消息没处理完
    但是不用消息 程序又容易崩溃
      

  3.   

    还有几个问题 让人非常郁闷
    EnterCriticalSection 可以保证不出错
    tryEnterCriticalSection速度快了   但是到最后全部线程都会挂掉