当前位置:编程学习 > Delphi >>

delphi 线程全局变量copy

delphi多线程如果使用对于变量的访问会出现安全的问题。对于局部变量与对象内部变量,每个线程对象都会有拷贝,因此不会相互干扰,但是如果访问的是全局变量呢?
 
那么就会出现问题,全局变量的值就会无法确定。我们看一下列子
[delphi]  
unit ThreadCopy;  
  
interface  
  
uses  
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;  
  
type  
  TForm1 = class(TForm)  
    btn1: TButton;  
    edt1: TEdit;  
    procedure btn1Click(Sender: TObject);  
  private  
    { Private declarations }  
  public  
    { Public declarations }  
  end;  
  
  
var  
  Form1: TForm1;  
  
  
implementation  
  
{$R *.dfm}  
  
threadvar  
  GlobalStr : string;  
  
type  
  TTLSThread=class(TThread)  
    private  
      FNewStr : string;  
    protected  
      procedure Execute;override;  
  
    public  
      constructor Create(const ANewStr : string);  
  end;  
  
procedure SetGlobalStr(str : string);  
begin  
  if str=' ' then  
    messagebox(0,PChar(GlobalStr),'this str is..',MB_OK)  
  else  
    GlobalStr:=str;  
end;  
  
{ TTLSThread }  
  
constructor TTLSThread.Create(const ANewStr: string);  
begin  
  FNewStr:=ANewStr;  
  inherited Create(False);  
end;  
  
procedure TTLSThread.Execute;  
begin  
  FreeOnTerminate:=True;  
  SetGlobalStr(FNewStr);  
  SetGlobalStr(' ');  
end;  
  
procedure TForm1.btn1Click(Sender: TObject);  
begin  
  SetGlobalStr('hello');  
  SetGlobalStr(' ');  
  TTLSThread.Create('DilBret');  
  Sleep(100);  
  SetGlobalStr(' ');  
end;  
  
end.  
 
 
全局变量
GlobalStr 使用的threadvar进行的定义,那么这样定义会有什么好处呢?如果定义为threadvar那么当线程访问GlobalStr 时,并不是使用GlobalStr,而是使用GlobalStr 的拷贝,因此并不会影响其他线程的访问。大家可以尝试运行上面的代码。
补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,