线程定义  TClientDataThread = class(TThread)
  private
    Bufferdatastr :string;
  public
    BufferdatastrList:TStringlist;
    clienthost:string;
    paused:boolean;
    TcpClient_DataThread:TTcpClient;
    DT_ADC:TADOConnection;
    procedure synchNewData;
    constructor Create(CreateSuspended: Boolean);
    procedure Execute; override;
  end;
线程的动作
procedure TClientDataThread.Execute;
begin
  while not Terminated do
  begin
    while BufferdatastrList.Count=0 do   //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
    begin                                //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
      application.ProcessMessages;       //另外BufferdatastrList是程序主线程给它添加节点的
      sleep(1);
    end;
    synchNewData;
    WaitFor;
  end;
  TcpClient_DataThread.Free;
  if DT_ADC<>nil then
  begin
    DT_ADC.Connected:=false;
    DT_ADC.free;
  end;
end;
先谢谢大家啦!!

解决方案 »

  1.   

     while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
      begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
      application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
      sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
      end;
      

  2.   

    那能不能改用waitfor的啊?应该怎样改啊?
      

  3.   

    UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
      

  4.   

    这线程明显有问题,在线程执行函数里等待自身,WaitFor不能等待自身,会线程死锁的
    你要等待可以用WaitForSingleObject,自己用CreateEvent创建个事件
      

  5.   

    我想等待一个变量,例如waitfor(BufferdatastrList.Count > 0 )这样,不知道行不行啊
      

  6.   

    你可以挂起啊,suspend;
    然后定时器扫描BufferdatastrList.Count ,符合条件时唤醒resume
      

  7.   

    application.ProcessMessages
    注意:线程里面不能用上句。你看看诸多例子中,都没有这样用的。
      

  8.   

    while BufferdatastrList.Count=0 do //感觉这里有点不对劲的地方,这里是不是一直会占用系统资源?
      begin //记得线程好象有waitfor的,如果这里要改用waitfor应该怎样去改啊?
      application.ProcessMessages; //另外BufferdatastrList是程序主线程给它添加节点的
      sleep(1);--------------如果这里不加这句的话 就会一直占用系统资源,加了就没事了~~~~~
      end;你的线程在空转,消耗CPU不知道么??
    BufferdatastrList.Count=0
    这个如果是大多数时间成立,而且也必须要做操作的话,那么表明的业务很频繁,频繁到要一直占用CPU。
    如果你的要求不是1MS就轮巡一次的话,可以SLEEP久点,防止CPU空转。
      

  9.   

    用WaitForSingleObject或者TSimpleEvent
    每次对BufferdatastrList操作的时候发送event,
      

  10.   

    uses SyncObjs;
    ......
    var
       Fevent:TSimpleEvent;
    ..... FEvent:=TSimpleEvent.Create;
    .......
     if Fevent.WaitFor(300)<>wrTimeout then
    .....
     Fevent.ResetEvent;
    .....