程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi 線程全局變量copy

delphi 線程全局變量copy

編輯:Delphi

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 的拷貝,因此並不會影響其他線程的訪問。大家可以嘗試運行上面的代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved