//这是关闭程序前释放线程部份,就这里一点这个按键程序就挂了,死了,不动了
procedure TFRMMain.BitBtn8Click(Sender: TObject);
begin
  AThread.Terminate;
  AThread.WaitFor;
  AThread.Free;
  application.Terminate;
end;下面是有关的线程创建,启动调用,
procedure TFRMMain.FormShow(Sender: TObject);
begin
 aThread:=TMyThread.Create(True);//在界面显示时创建线程
end;procedure TFRMMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
begin
  str:=str+pchar(buffer);
  if bufferlength<2048 then
  begin
      aThread.Resume;//在串口数据接收完后启动线程
  end;
end;procedure TMyThread.Execute();     //执行线程
begin
 while   not   terminated   do
 begin
........//这里是接收到串口数据解析和显示到listview1的代码部份,因为比较多,为了看方便,我这里就删除了      
 end;
    sleep(10);
 end;
end;

解决方案 »

  1.   

    这个线程完全是多此一举的。
    直接在OnReceiveData处理就可以了
      

  2.   

    應該是卡在AThread.WaitFor;
    執行完AThread.Terminate;跟蹤 AThread的terminated屬性是否為True...
      

  3.   

    代码没啥问题Execute是不是循环太多
    可以简化代码测试
      

  4.   

    不能在串口中处理,因为数据量很大,一次数据过来并显示出来,如果在里面处理,程序就如死了一样,别的什么都不能操作,所以才想到开一个线程处理,Excute里是有很多循环就是循环分割数据,一般是100-500次左右的样子(讲起来也不算多);
      

  5.   

    while  not  terminated  do
    begin
    ........//这里是接收到串口数据解析和显示到listview1的代码部份,因为比较多,为了看方便,我这里就删除了     
    end; 这里面也有循环吧。最好也能过判断terminated来退出内循环。
    在停止时只执行 AThread.Terminate 这一句。在TMyThread.Execute()最后一句用 postmessage 给主窗体发送消息,或在线程的onTerminate 事件中给主窗体发消息,通知线程结束了。
    然后在free和退出。
      

  6.   

     
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyThread=class;
      TForm1 = class(TForm)
        btnStopThread: TButton;
        btnRunThread: TButton;
        procedure FormShow(Sender: TObject);
        procedure btnStopThreadClick(Sender: TObject);
        procedure btnRunThreadClick(Sender: TObject);
      private
        { Private declarations }
        aThread: TMyThread;  public
        { Public declarations }
      end;  TMyThread=class(TThread)
      private
        procedure doJob;
      protected
        procedure Execute;override;
      end;
    var
      Form1: TForm1;
      FIsRun:Boolean;
    implementation{$R *.dfm}{ TMyThread }procedure TMyThread.Execute;
    begin
      inherited;
      while not  Terminated  do
      begin
         if  (Terminated=True) and (FIsRun=False)  then
         begin
           Terminate;
         end;
         doJob;
      end;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      aThread:=TMyThread.Create(True);
    end;procedure TForm1.btnStopThreadClick(Sender: TObject);
    begin
      FIsRun:=False;
    end;procedure TMyThread.doJob;
    begin
       while true do
       begin
         //这里也可以进行循环检测 terminated标识
       end;
    end;procedure TForm1.btnRunThreadClick(Sender: TObject);
    begin
       aThread.Resume;
       FIsRun:=True;
    end;end.