我在线程中做的事情是每隔60毫秒往串口发送一个数据
所以我在Execute里面写
procedure TSendThread.Execute;
begin
  while not Terminated do
  begin
  SendCommandBuffer; //这是自己写的函数,往串口发数据用的
  sleep(60);
  end;
end;
然后CPU就100% 了,我的程序里面只有这一个子线程,优先级是tpLower,那么是不是这个Sleep的问题呢?怎样做到每隔一定的时间做一件事情啊,Timer好像在线程里面也不大好用哦。。

解决方案 »

  1.   

    用临界区来做,不要用sleep。
      

  2.   

    试试这个Delay函数吧,单位是1毫秒procedure Delay(lMilliSeconds: Dword);
    var lStart: DWord;
    begin
       lStart := GetTickCount;
       while GetTickCount - lStart <= lMilliSeconds do
          Application.ProcessMessages;
    end;
      

  3.   

    看看帮助:CS: TRTLCriticalSection;InitializeCriticalSection(CS);EnterCriticalSection(CS);LeaveCriticalSection(CS);DeleteCriticalSection(CS);
      

  4.   

    主线程有等待 TSendThread 的返回吗?多线程程序 CPU 100%,有可能是存在2个线程互相等待返回比如说,sleep之前一句 函数SendCommandBuffer中,
    持有了一个锁(比如TMultiReadExclusiveWriteSynchronizer,或者TRTLCriticalSection),
    没有释放(EndRead,EndWrite, LeaveCriticalSection之类)
    而主程序当前执行代码正请求这个锁...
     
      

  5.   

    以及主线程中明确使用 WaitForSingleObject WaitForMultiObjects之类的函数 需要等待TSendThread的返回
      

  6.   

    在多线程中,用Sleep()应该是常用手段吧。
      

  7.   

    gxgyj(Jackson...) ( ) 信誉:94 ,你的Sleep和我自己写的AntiFreezeSleep完全一样,哈哈
    英雄所见略同