一个按钮1按下,触发了一个线程;在此线程结束前,另一按钮2按下,终止这个线程。按钮1click中写的是线程的create(false);  ,按钮2click中写的是线程的doterminate;。然后程序就死了,我应该怎么做呢?

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      Tdd=class(tthread)
      protected procedure execute;override;
                procedure sss;
      end;
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        dd:tdd;
        procedure ss(sender:tobject);
       
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ Tdd }procedure Tdd.execute;
    begin
      inherited;
      self.FreeOnTerminate:=true;
      self.OnTerminate:=form1.ss;
      synchronize(self.sss);
    end;procedure Tdd.sss;
    var i:integer;
    begin
      while form1.ProgressBar1.Position<form1.ProgressBar1.Max do
      begin
        for i:=0 to 200000 do;
        form1.ProgressBar1.StepIt;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      dd:=Tdd.Create(false);
    end;procedure TForm1.ss(sender: tobject);
    begin
      self.ProgressBar1.Position:=0;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      dd.DoTerminate;
    end;end.
    帮忙了,各位高手
      

  2.   

    procedure Tdd.execute;
    begin
      synchronize(self.sss);
    end;procedure Tdd.sss;
    var i:integer;
    begin
    while not Tdd.Terminate do
    begin
      while form1.ProgressBar1.Position<form1.ProgressBar1.Max do
      begin
        for i:=0 to 200000 do
        begin
            form1.ProgressBar1.StepIt;
        end;
      end;
    end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      dd:=Tdd.Create(false);
      dd.FreeOnTerminate:=true;
      dd.OnTerminate:=form1.ss;
    end;procedure TForm1.ss(sender: tobject);
    begin
      self.ProgressBar1.Position:=0;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      dd.DoTerminate;
    end;end.你这样试试.其实我觉得你根本没必要用线程来实现这个功能.
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      dd:=Tdd.Create(false);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      freeandnil(dd);
    end;
      

  4.   

    如果线程没有接收,用freeandnil(dd)报错,在线程内建BOOL变量,开始值为false,
    现在create的时候变为true,Button2Click按下的时候变为false,当线程变量变为
    false是,线程主动退出,再freeandnil(dd);
      

  5.   

    多谢各位,刚刚搞定,其实在循环中加入application.postmessage就可以了。不过还要问一下cjf1009(农民程序员) ,我以前在execute中用synchronize()方法后,程序就会等到线程自己执行完才会接受新消息执行新的命令,只用synchronize()方法可以吗?