以前没用过多线程,昨天在网上找到creatthread这个方法,小试一下还真实现了传说的多线程。
但是现在遇到一个“取消当前操作”的问题,也就是说我要在线程外打断前面正在执行的线程
procedure TForm1.Button9Click(Sender: TObject);
var
  hThread:Thandle;//定义一个句柄
  ThreadID:DWord;
begin
//创建线程,同时Search线程函数被调用
  hthread:=CreateThread(nil,0,@Search,nil,0,ThreadID);
end;昨天试着在另一个按钮事件中用了
exitthread方法结果程序界面没了,但仍在运行

解决方案 »

  1.   

    最简单的办法是用TerminateThread,但这也是最差的办法,因为会导致线程的资源无法释放,我建议楼主最好是加个标志,如bThreadExit:Boolean,在线程外设置这个标志bThreadExit := true,线程内检测到这个标志后就自己退出
      

  2.   

    微软建议最好不要用TerminateThread函数来结束线程的
    其实可以这样!你在线程的运行函数中放一个标记!然后判断标记是否为真,是就继续执行,否则就退出执行函数
    这样就可以把线程取消了!
      

  3.   

    应该在Execute中循环判断是否要求退出.要求指定线程退出,直接标记退出就可以了.循环会正常终止,然后结束Execute过程自动退出了.
      

  4.   

    to:
    zhaoyu_me & suiyunonghen 
    你们的方法好像都不管用,我不知道问题出在那里,下面给出我参考的多线程例子,
      Dialogs, StdCtrls, Buttons;
    type
      TForm1 = class(TForm)    BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;    procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;
    implementation
    {$R *.dfm}
    function MyThreadFunc(P:pointer):Longint;stdcall;
    var
      i:longint;
      DC:HDC;
      S:string;
    begin
      DC:=GetDC(Form1.Handle);
      for i:=0 to 500000 do begin
        S:=Inttostr(i);
        Textout(DC,10,10,Pchar(S),length(S));
      end;
      ReleaseDC(Form1.Handle,DC);
    end;procedure TForm1.BitBtn1Click(Sender: TObject);var
      hThread:Thandle;//定义一个句柄
      ThreadID:DWord;
    begin
    //创建线程,同时线程函数被调用
      hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
      if hThread=0 then
      end;procedure TForm1.BitBtn2Click(Sender: TObject);begin
      MyThreadfunc(nil);
      //没有创建线程时,直接调用线程函数
    end;
    procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
    close;
    end;end.
      

  5.   

    先问下Execute是什么意思,呵呵~
    还有你说的那个方法,能不能写个例子
      

  6.   

    TerminateThread(hthread,1)能结束线程,但听你们说这个不太好,
    能不能贴出些代码把那些好方法教教我