| 发表于:2007-10-31 16:44:56 楼主 |
今天使用reasesemphore函数,遇到闹鬼的事,换了好几台机器结果都是一样,诡异~~~ 有问题的地方就是fun1函数中的r2:= releasesemaphore(shandle1,2,x);,只要前或后有对布尔变量的判断,x就能带回正确的值,若没有,就只能是nil~~~~大家帮忙看看这是怎么回事啊? unit unit1; interface uses 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. |
|
|
|
|