小弟第一次写多线程哈  还请多多指教  呵呵
小弟谢了三个线程 这三个线程需要同一时间运行 
procedure a.Execute;
begin
  while not Terminated do
   begin
    Synchronize(aa);
     Sleep(100);
   end;
在函数aa中因为必须的暂停一秒再执行下一条语句 所以有一些sleep(10)(循环100次) 
比如:
get(1);
for yanshi := 0 to 100 - 1 do
   begin
      Sleep(10);
   end;
rixi();//中间必须有500毫秒以上的延时才行
可是这样程序很占cpu的使用率 而且程序特容易假死  请问应该怎么写才能达到相应的效果而不假死呢? 谢谢!

解决方案 »

  1.   

    for yanshi := 0 to 100 - 1 do 
      begin 
          Sleep(10); 
      end;其实跟SLEEP(1000)没多大区别在程序中尽量不要使用SLEEP语句,因为它可能会造成一些不可预知的错误.
    既然你需要那么多延迟不如用个定时器来做延迟,在延迟前将这个线程挂起,延迟时间到了再将线程唤醒
      

  2.   

    在主线程这么频繁地调用SLEEP就等于挂起消息队列,停滞消息队列运转意味着界面假死,响应不到界面消息!
      

  3.   

    假死的真正原因在这里:Synchronize(aa);
      

  4.   

    Sleep函数无论在线程中,还是在其它程序中,都是需要占用CPU资源的。而不是在于Synchronize方法的调用。楼主可以将Synchronize方法注释掉试试,CPU的利用率仍然不会下降。
    如果不想占用CPU资源,可以使用这样一个函数:
    Procedure SleepX(ms:Integer) //ms为待暂停的毫秒数
    var
      StartTime:TDateTime;
    begin
      StartTime:=Now();//记录开始时的时间
      While(MilisecondsBetween(StartTime,Now())<ms) then
      begin
        Application.ProcessMessage();//让空闲时间去处理主线程,就不会占用当前线程的时间了
      end;
    end;
    //上面的函数有可能拼写错误,请楼主用时检查,使用时需要引用DateUtils单元。
      

  5.   

    你知道为什么要用Synchronize吗?如果弄明白了就能解决问题了。
      

  6.   

    MilisecondsBetween这个是什么函数呀?
      

  7.   

    我引用DateUtils单元了 可是还是提示没有定义
      

  8.   

    正确的拼写应该是MilliSecondsBetween,它是计算两个DateTime类型的变量的间隔时间,其单位为毫秒数。