今天使用ReaseSemphore函数,遇到闹鬼的事,换了好几台机器结果都是一样,诡异~~~
有问题的地方就是fun1函数中的r2:= ReleaseSemaphore(SHandle1,2,x);,只要前或后有对布尔变量的判断,x就能带回正确的值,若没有,就只能是nil~~~~大家帮忙看看这是怎么回事啊?unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;procedure fun1();stdcall;var
Form1: TForm1;
SHandle1,THandle1,THandle2: THandle;
dw: Cardinal;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
SHandle1:= CreateSemaphore(nil,3,4,'sss');
THandle1:= CreateThread(nil,0,@fun1,nil,0,dw);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseHandle(SHandle1);
CloseHandle(THandle1);
end;procedure fun1();stdcall;
var r1,r2: Boolean;
a:Integer;
x: PInteger;
begin a:=WaitForSingleObject(SHandle1,INFINITE);
//if r1 then //如果没有这句话,x的值就不正常。r1和r2应该没有什么关系,但却影响函数的执行结果。
Form1.Memo1.Lines.Add('fun1-Leave');
r2:= ReleaseSemaphore(SHandle1,2,x); Form1.Memo1.Lines.Add(IntToStr(Integer(x)));end;
end.
有问题的地方就是fun1函数中的r2:= ReleaseSemaphore(SHandle1,2,x);,只要前或后有对布尔变量的判断,x就能带回正确的值,若没有,就只能是nil~~~~大家帮忙看看这是怎么回事啊?unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;procedure fun1();stdcall;var
Form1: TForm1;
SHandle1,THandle1,THandle2: THandle;
dw: Cardinal;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
SHandle1:= CreateSemaphore(nil,3,4,'sss');
THandle1:= CreateThread(nil,0,@fun1,nil,0,dw);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseHandle(SHandle1);
CloseHandle(THandle1);
end;procedure fun1();stdcall;
var r1,r2: Boolean;
a:Integer;
x: PInteger;
begin a:=WaitForSingleObject(SHandle1,INFINITE);
//if r1 then //如果没有这句话,x的值就不正常。r1和r2应该没有什么关系,但却影响函数的执行结果。
Form1.Memo1.Lines.Add('fun1-Leave');
r2:= ReleaseSemaphore(SHandle1,2,x); Form1.Memo1.Lines.Add(IntToStr(Integer(x)));end;
end.
这是delphi编译器的事情。
如果你使用类似这样的语句。
r2:= ReleaseSemaphore(SHandle1,2,x);
但是在整个过程中没有使用这个变量的话,
那么这个赋值语句就不会执行。
这就是编译器优化。