小弟原来发个求助 关于降低cpu占用率的问题  可是现在小弟用sleep和
procedure sleepx(ms:Integer);
var
staretime:TDateTime;
begin
  staretime:=Now();
  while MilliSecondsBetween(staretime,Now())<ms do
   begin
      Sleep(1);
      Application.ProcessMessages();
   end; 
end;
这个方法都造成了程序的假死 我有三个线程同时运行 结果有两个运行sleepx函数 第三个线程都没启动就死了...
sleepx(1000);
a:=aa.create(false);
这样就崩了
请问 这个应该怎么改?谢谢!

解决方案 »

  1.   

    为什么要用sleepx?
    直接sleep就行了,子线程中不要处理消息。
      

  2.   

    子线程sleep怎么会假死
    贴代码吧
      

  3.   

    线程里,sleep够了,才会执行下一行语句的
      

  4.   

    procedure A.execute;
    begin
      while not Terminated do
       begin
         Synchronize(AA);
         sleepx(1000);
       end;
    end;
    procedure A.AA
    BEGIN
                fun(@KK,@id,True);
                sleepx(3000);
                fun(@GG,@ID,False);
                sleepx(1000);
                BB();
                sleepx(1000);
                fun(@LL,@ID,False);
                sleepx(1000);
    END
    这个是线程之一 另外两个也是类似的 程序老假死....
    procedure sleepx(ms:Integer); 
    var 
    staretime:TDateTime; 
    begin 
      staretime:=Now(); 
      while MilliSecondsBetween(staretime,Now()) <ms do 
      begin 
          Sleep(0); 
          Application.ProcessMessages(); 
      end; 
    end; 
      

  5.   

    Synchronize(AA);
    这句会同步到主线执行,阻塞主线运行,一般需要操作VCL才会使用 Synchronize
      

  6.   

    Synchronize(AA);
    这句加上了就意味着AA是到主线程中执行的,你AA中sleep就是把主线程阻塞了,当然会假死