今天使用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.

解决方案 »

  1.   

    呵呵,
    这是delphi编译器的事情。
    如果你使用类似这样的语句。
    r2:=   ReleaseSemaphore(SHandle1,2,x); 
    但是在整个过程中没有使用这个变量的话,
    那么这个赋值语句就不会执行。
    这就是编译器优化。
      

  2.   

    问题是我判断的是r1啊~~~if r1 then跟r2八竿子打不着,可是没有这个if判断,而且没有判断布尔值的话,也是能带回正确的值地~~~比如:if x<>nil,得不到正确的值,必须得 if <布尔变量> then