传参数,不要全局变量!有人说 property 可以,但不懂怎么搞!难道把 TTread 再封装成组件吗?

解决方案 »

  1.   

    主线程传递参数给子线程吗?重写create构造不行吗?创建的时候直接把参数塞进去……
      

  2.   

    乱写了一个,不知合不合适!!!!!!!!!!!!!!!!!!!!!!!!!!
    还算不算多线程,会有什么例外吗?????
    ///Thread1.pas
    unit Thread1;interfaceuses
      Dialogs, SysUtils, Classes, StdCtrls;type
      TThread1 = class(TThread)
      private
        Params : string;
        SleepSec : integer;
        F : TMemo;
      protected
        procedure Execute; override;
      public
        constructor Create(P : string; S : integer; Fxx : TMemo);
      end;  TThreadCom1 = class(TComponent)
      private
        Thread1 : array of TThread1;
      public
        constructor Create(AOwner:TComponent);override;
        destructor  Destroy;override;
        procedure Thread1Create(a1:array of string; a2:array of integer; F : TMemo);
        procedure Thread1Execute();
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Win32', [TThreadCom1]);
    end;{ TThreadCom1 }constructor TThreadCom1.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    end;destructor TThreadCom1.Destroy;
    begin
      inherited;
    end;procedure TThreadCom1.Thread1Execute;
    var
      i : integer;
    begin
      for i := 0 to length(Thread1) - 1 do
        begin
          //Thread1[i].Resume;
        end;
    end;procedure TThreadCom1.Thread1Create(a1:array of string; a2:array of integer; F : TMemo);
    var
      i : integer;
    begin
      setlength(Thread1, 3);
      for i := 0 to length(a1) - 1 do
        begin
          Thread1[i] := TThread1.Create(a1[i], a2[i], F);
          Thread1[i].Resume;
        end;
    end;{ TThread1 }constructor TThread1.Create(P: string; S: integer; Fxx : TMemo);
    begin
      Params := P;
      SleepSec := S;
      F := Fxx;  FreeonTerminate:=true;//当执行完后是否自动销毁
      inherited Create(true);//表示是否挂起,false直接执行execure方法
    end;procedure TThread1.Execute;
    begin
      sleep(SleepSec);
      //showmessage(Params);
      //showmessage(F.Caption);
      F.Lines.Add(Params);
    end;end.
    ////////////////////////////////////////////
    //测试procedure TForm1.Button1Click(Sender: TObject);
    var
    x1 : TThreadCom1;
    a1 : array[0..2] of string;
    a2 : array[0..2] of integer;
    begin
    x1 := TThreadCom1.Create(nil);
    a1[0] := '中国';
    a1[1] := '日本';
    a1[2] := '美国';a2[0] := 1000;
    a2[1] := 300;
    a2[2] := 500;
    x1.Thread1Create(a1, a2, Memo1);
    x1.Thread1Execute;
    end;
      

  3.   

    原来  TThread1 = class(TThread)
      private
        Params : string;//原来这些变量不会被多个线程共享的......是这样吧
        SleepSec : integer;
      

  4.   

    Thread1[i] := TThread1.Create(a1[i], a2[i], F);//这里传值进去例如 Thread1[0] 传值进去了..
      Params := P;
      SleepSec := S;那 Thread1[1] 修改 Params\SleepSec 的值,
    会不会影响到 Thread1[0] 的 Params\SleepSec值