下面代码 为什么会卡主界面 THREAD不是线程类么type
  Scaner = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
procedure Scaner.Execute;
var
i:Integer;
begin
for i := 0 to 100 do  begin
  Sleep(100);
  end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
s:Tscan;
begin
  s:=Tscan.Create;
  s.Execute;
end;这样启动线程 为什么会卡主程序啊多线程

解决方案 »

  1.   

    不需要手动调用线程的Execute事件,线程会自己调用这个事件
      

  2.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TScaner = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s: TScaner;
    begin
      s := TScaner.Create(False);
    end;{ Scaner }procedure TScaner.Execute;
    var
      i: Integer;
    begin
      Self.FreeOnTerminate := True;
      for i := 0 to 100 do
      begin
        Sleep(100);
      end;
    end;end.
      

  3.   

    意思是说  s := TScaner.Create(False);的时候  就直接执行了TScaner.Execute;里面的代码?
      

  4.   

    意思是说  s := TScaner.Create(False);的时候  就直接执行了TScaner.Execute;里面的代码?
      
    是的! 
      

  5.   

    那我要启动多个线程怎么做么
    s := TScaner.Create(False);
    s1 := TScaner.Create(False);
    s2 := TScaner.Create(False);
    这样?好像不太好管理
    能不能用数组的方法这样创建
      

  6.   

    procedure tScaner.Execute;
    var
    i:Integer;
    begin
    getinfo(Self.user,Self.pass,Self.id);
    end;
    procedure TForm1.Button4Click(Sender: TObject);
    var
    s:array of tScaner;
    i:Integer;
    begin
    for i := 0 to 5 do
    begin  s[i].user:= form1.bsSkinListView1.Items[i].Caption;//我这样写 程序在这一行都报错误,LISTVIEW有赋值的  s[i].pass:=bsSkinListView1.Items[i].SubItems.Strings[0];
      s[i].id:=i;
        s[i]:=tScaner.Create(false);
    end;
      

  7.   


    procedure TForm1.Button4Click(Sender: TObject);
    var
    s:array of tScaner;
    i:Integer;
    begin
    for i := 0 to 5 do
    begin  s[i].user:= form1.bsSkinListView1.Items[i].Caption;//我这样写 程序在这一行都报错误,LISTVIEW有赋值的  s[i].pass:=bsSkinListView1.Items[i].SubItems.Strings[0];
      s[i].id:=i;
        s[i]:=tScaner.Create(false);
    end;
      

  8.   


    procedure TForm1.Button4Click(Sender: TObject);
    var
    s:array of tScaner;
    i:Integer;
    begin
    SetLength(s, 6);//动态数组需先设置数组的长度
    for i := 0 to 5 do
    begin
      s[i]:=tScaner.Create(True);//创建初始化线程时先将线程挂起,传True就是挂起
      s[i].user:= form1.bsSkinListView1.Items[i].Caption;
      s[i].pass:=bsSkinListView1.Items[i].SubItems.Strings[0];
      s[i].id:=i;
      s[i].Resume;//启动线程执行
    end;