我创建了一个线程后,未执行完时想释放掉它重新创建新的线程。
使用terminate方法后,程序还是去执行线程的相关代码。
是否还有其他更好的方法?

解决方案 »

  1.   

    你是不是没有在线程运行中判断Terminated属性呀?
      

  2.   

    To pazee(耙子)
    查询窗口部分代码:
    ...  private
        ThreadList:Tlist;
    ...var
      RefThread:TrefreshThread;
    ...
    implementation
    ...
    procedure Timg_formSearch.BitBtn1Click(Sender: TObject);
    var
        s:string;
    begin
      with CDSExec do
      try
        Close;
        CommandText := 'select * from img_manageinfo_main';
        open;
        cds.Close;
        cds.CommandText:=CDSExec.CommandText;
        cds.open;
        if IsEmpty then Application.MessageBox('没有查到任何记录!', '', MB_ICONWARNING + MB_OK);
      except
        on E: Exception do
          begin
            Application.MessageBox('查询因错误中止!', '', MB_ICONINFORMATION + MB_OK);
            exit;
          end;
      end;
     if CDS.RecordCount>0 then
     begin
          while ThreadList.count>0 do
          begin
            TrefreshThread(ThreadList[ThreadList.count-1]).terminate;
            ThreadList.Delete(ThreadList.Count-1);
          end;
          listview1.Clear;
          img_show.Clear;
          ThreadList.Add(TrefreshThread.Create(CDS,listview1,img_show));
     end;
    end;线程单元代码:
    unit RefreshThread;interfaceuses
      Classes,ComCtrls,Graphics,Dialogs,dbclient,controls,sysUtils,Forms;type
      TRefreshThread = class(TThread)
      private
        { Private declarations }
        ListItem:TListItem;
        bmp:tbitmap;
        imgindex:integer;
        tempfilepath:string;
        CDS:Tclientdataset;
        ListViewThr:TlistView;
        img_showThr:TImagelist;
        procedure getpath;
      protected
        procedure Execute; override;
      public
        constructor Create(C:TclientDataset;L:TListview;I:TimageList);virtual;
      end;implementationuses img_search, pub;constructor TRefreshThread.Create(C: TClientDataset; L: TListview;i:TimageList);
    begin    CDS:=C;
        CDS.First;
        ListViewThr:=L;
        img_showThr:=I;
        FreeOnTerminate:=True;
        inherited Create(false);
    end;procedure TRefreshThread.Execute;begin
      inherited;
        //  listview.Clear ;
        //img_show.Clear ;
         while not CDS.Eof do
         begin
             try
             if Terminated then
             break;
             bmp:=tbitmap.Create ;
             Synchronize(getpath);
             bmp.LoadFromFile(tempfilepath);
             Stretch(bmp);
             imgindex:=img_showThr.Add(bmp, nil);
             ListItem:=listviewThr.Items.Add;
    ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ;
             ListItem.ImageIndex:=imgindex;
             bmp.Free;
             CDS.Next ;
             except
                 bmp.LoadFromFile(ExtractFilepath(Application.ExeName)+'CUST080.BMP');
                 Stretch(bmp);
             imgindex:=img_showThr.Add(bmp, nil);
             ListItem:=listviewThr.Items.Add;
             ListItem.Caption:=CDS.FieldByName('cd_sn').AsString+#13#10+CDS.FieldByName('file_name').AsString+#13#10+CDS.FieldByName('img_name').AsString ;
             ListItem.ImageIndex:=imgindex;
             bmp.Free;
             CDS.Next ;
             end;
         end;
    end;procedure TRefreshThread.getpath;
    begin
    if (not Terminated) then
    tempfilepath:=Getpathico(CDS.FieldByName('Cd_sn').AsString,CDS.FieldByName('File_name').AsString);
    end;
    end.To zuoyexingchen(昨夜星尘)
    如上代码,我判断Terminate属性了。