delphi 线程全局变量copy
delphi多线程如果使用对于变量的访问会出现安全的问题。对于局部变量与对象内部变量,每个线程对象都会有拷贝,因此不会相互干扰,但是如果访问的是全局变量呢?
那么就会出现问题,全局变量的值就会无法确定。我们看一下列子
[delphi]
unit ThreadCopy;
inte易做图ce
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 ,