问题如题

解决方案 »

  1.   

    threadvar 是在线程内的局部变量
    出了线程就没用了。
    有点像一个函数中定义的变量,在这个函数之外就没用了。。开发人员指南上我记得有一个例子的。
      

  2.   

    找到了,就是这个unit Main;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TMainForm = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      MainForm: TMainForm;implementation{$R *.DFM}{ NOTE: Change GlobalStr from var to threadvar to see difference }
    var
    //threadvar
      GlobalStr: string;type
      TTLSThread = class(TThread)
      private
        FNewStr: String;
      protected
        procedure Execute; override;
      public
        constructor Create(const ANewStr: String);
      end;procedure SetShowStr(const S: String);
    begin
      if S = '' then
        MessageBox(0, PChar(GlobalStr), 'The string is...', MB_OK)
      else
        GlobalStr := S;
    end;constructor TTLSThread.Create(const ANewStr: String);
    begin
      FNewStr := ANewStr;
      inherited Create(False);
    end;procedure TTLSThread.Execute;
    begin
      FreeOnTerminate := True;
      SetShowStr(FNewStr);
      SetShowStr('');
    end;procedure TMainForm.Button1Click(Sender: TObject);
    begin
      SetShowStr('Hello world');
      SetShowStr('');
      TTLSThread.Create('Dilbert');
      Sleep(100);
      SetShowStr('');
    end;end.
      

  3.   

    ThreadVar是线程局部变量,用于多线程应用程序。线程局部变量与全局变量相似,不同的是执行的每个线程获得线程局部变量的一个私有副本,该变量副本不能被其他线程反问。线程局部变量用threadvar代替var来声明。例如threadvar X: Integer; 线程局部变量声明具有下列特点:·不能出现在过程或函数中。·不能包括初始化。·不能在说明中使用指示字absolute。不要创建指针或程序型类型的线程变量,也不要在动态加载库(dynamically loadable libraries,有别于其他的包)中使用线程变量。被编译器一般管理的动态变量,长串,宽串,动态数组,变体,以及接口,可以用threadvar声明,但编译器不会自动释放为执行的每个线程在堆中创建的内存。如果要在线程变量中使用这些数据,则有责任释放其内存。例如, threadvar S: AnsiString;S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; ...S := '';  // 释放变量S使用的内存 (可以通过置变量的值为Unassigned来释放变体;通过置变量的值为nil来释放接口或动态数组。)