下面是我写的一个简单的线程试验代码,但我发现,点击Button1,执行Button1下的一段程序时,我的线程就不工作了(线程优先级我已经设为最大),一定要等到Button1下代码执行完后才能再执行。
请问有不有什么办法让我的线程一直运行,不必等待其它代码的执行?
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;type
  TMyThread = class(TThread)
      FGo : boolean;
      Fi:integer;
    public
      procedure Execute;override;
      procedure Stop;
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    MyThread : TMyThread;
    e : boolean;
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
  d:Double;
begin
  e := true;
  while (d<10000) and e do
  begin
    d:= d+0.1;
    edit2.text := floattostr(d);
    edit2.refresh;
  end;
end;procedure TForm1.Button2Click(Sender: TObject);begin
  MyThread := TMyThread.Create(true);
  MyThread.Priority := tpTimeCritical;
  MyThread.Resume;
end;{ TMyThread }procedure TMyThread.Execute;
begin
  FreeOnTerminate := true;
  FGo := true;
  fi:=0;
  while FGO do
  begin
    inc(fi);
    form1.edit1.text := inttostr(fi);
    form1.edit1.refresh;
    sleep(1000);
  end;
end;
procedure TMyThread.Stop;
begin
  FGo := false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  MyThread.Stop;
  MyThread := nil;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
  e := false;
end;
end.

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      d:Double;
    begin
      e := true;
      while (d<10000) and e do
      begin
        d:= d+0.1;
        edit2.text := floattostr(d);
        edit2.refresh;
        Application.ProcessMessages;          /// 加这一句。
      end;
    end;因为你在后台线程内占用了界面线程的时间,而界面线程又特别的繁忙,所以无法处理后台线程的请求,从而导致后台线程阻塞。如果你把
     TMyThread.Execute; 中的两句话去掉。
        form1.edit1.text := inttostr(fi);
        form1.edit1.refresh;则线程不会阻塞,会一直运行下去的。验证方法,当你停止线程的时候在取出
    fi的值看,是正常增长的。