多线程中的VAR 与 THREADVAR 的区别???及其SLEEP 的作用???(100分)

  • 主题发起人 主题发起人 小度
  • 开始时间 开始时间

小度

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面的代码:
unit Main;
interface
uses
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 //请注意这里的全局变量类型: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(2000);
//SLEEP 函数在这里到底起什么作用呢??????????
SetShowStr('');
end;
end.
在以上代码中,改变全局变量GLOBALSTR 的类型会出现不同的效果!!但注销
。。。。。
Sleep(2000);
//SLEEP 函数在这里到底起什么作用呢??????????
。。。。。。。
这行之后的结果和运用THREADVAR或VAR类型变量的结果相同,为什么?????它在这里起什么作用呢?????
 
threadvar,顾名思义,就是线程区域变量,你定义的这个变量实际上每个线程有自己单独的空间,并非如全局变量一样是同一个地址的东东.
sleep可以让一个执行线程"暂休"一下,一般来说,从来不需要在主线程中用sleep.
 
TO LYNU
在没有注销SLEEP 之前,分别更换全局变量GLOBALSTR的类型!!当为VAR类型时:其值依次为 HELLO WORLD! 'Dilbert'!'Dilbert'! 为THREADVAR类型时:为HELLO WORLD! 'Dilbert' !HELLO WORLD! 全局变量GLOBALSTR的值在执行线程之后的值发生了变化!!
在注销SLEEP之后 ,GLOBALSTR的值在执行线程之后依然保留了其前的值
呵呵!!就是这里不明白!!!!!!
劳驾指教!!!谢谢!!!
 
难道没有真正的大侠嘛????????难道。。。。。。。。。。。。。。。。。。
 
在线程中访问全局变量时最好用线程同步技术,临界区,互斥,或信号量,这样才能保证全局变量的内容正确。具体用法请查看手册
 
在这里如果将threadvar改为var将成为全局变量,因而对每个属于这个类的线程,用到的都是同一个变量,但用threadvar定义的则是每一个线程所私有的。并不与其它的同一类的线程的例程所share
threadvar
x : integer;
declares an integer type variable that is private to each thread in the application
but not shared with other instances of the same thread class.
 
尽量不要用threadvar,效率太差!还是定义成线程的私有变量效率高得多。
 
偶也补充一句,线程中不要使用SLEEP函数,改用WaitForSingleObject()或WaitForMultiObject()函数吧,SLEEP有很多不确定性。
 
各位大侠!!偶关心的是为什么全局变量在没有SLEEP时她的值是保存原来的值呢??按理说线程已经改变了她的值,但显示出来是没有!!WHY?????????这后面的执行步骤怎样呢??????????????????????????/
 
后退
顶部