部分代码如下:
//------------线程创建-------------------------//
   huatu:=sampthd.Create(true);    //主要是对串口数据进行实时处理
   huatu.Priority:=tpnormal;
   huatu.FreeOnTerminate:=true;   sampthd.create(false);//产生画图线程   mainthd:=true;    //execute 方法中死循环变量,
   huatu.Resume;//------------线程sampthd.execute方法-------------------------//
procedure sampthd.Execute;
var
...
begin
while mainthd do
  begin
    if in_index <> (out_index mod maxsize) then   //对接受到的串口数据进行处理分析
    begin //begin out
    out_index:=(out_index+1) mod maxsize;
    ... 
    end;
  end;
end.

解决方案 »

  1.   

    procedure sampthd.Execute;
    var
    ...
    begin
    while mainthd do
      begin
        if in_index <> (out_index mod maxsize) then   //对接受到的串口数据进行处理分析
        begin //begin out
        out_index:=(out_index+1) mod maxsize;
        ... 
        end;
        Sleep (1); //加一行 先得uses Windows
      end;
    end.
      

  2.   

    Sleep (1); //加一行 先得uses Windows
    why?这是什么意思啊?
    我是问我线程中的这个死循环有什么问题啊,我测出是因为使用了这个死循环才占用CPU100%的啊
      

  3.   

    如果要一直执行的话就是要死循环的,死循环当然就会100%占用CPU,因为你的线程一直在工作啊,CPU根本空闲不下来,所以,再循环体中加上sleep(1);这样的话,就会在循环的过程中暂时的释放CPU资源,当然为了防止失去响应还要加上application.ProcessMessages;
      

  4.   

    谢谢大家支持!
    application.ProcessMessages这个怎么用啊?用在线程中么?
      

  5.   

    application.ProcessMessages 在线程里面不需要用,因为线程独立于主线程,而且他没有线程消息循环。
      

  6.   

    每执行一次循环,wait()一段时间
      

  7.   

    to  Manwill71(天皇地虎江山一片)
       wait()直接使用在死循环中么
    to  lemon_wei(soft_fans)
       事件机制?我的死循环是用来等待接受源源不断的串口数据的啊,下位机数据发送频率为200HZ的啊
      

  8.   

    to 楼主正如 lemon_wei 说的,你的情况使用事件机制再合适不过了,
    CreateEvent 创建一个事件,
    没有数据的时候你的线程是等候状态,类似挂起,
    一旦超时或者发生事件,你的线程就会继续了。参看 CreateEvent 这些API,网上应该有线程的例子。
      

  9.   

    这类的伪实时的应该用插入sleep(xxx)来做。
      

  10.   

    对的,这应该是属于伪实时!但sleep我用过了,在死循环里使用,速度奇慢阿,好像是调用sleep下系统资源就被系统其他程序抢占,然后很难再获取了吧,画图刷新就开始奇慢了
      

  11.   

    Sleep(0);这样比较好,要不就挂起线程.
      

  12.   

    to 楼主:
    按照你说的我感觉是你的sleep放的位置不对。你是不是把sleep放在画canvas 的循环里面了?大致步骤如下
    begin
      读串口数据;
      画Canvas;
      Sleep(0);
    end;