情况。我创建了一个包含一些类的单元来解决代数问题(同余和方程组),以下是代码:
type
TCongrError = class(Exception)
end;
type
TCongruence = class(TComponent)
//code stuff
constructor Create(a, b, n: integer); virtual;
end;
type
TCongrSystem = array of TCongruence;
type
TCongruenceSystem = class(TThread)
private
resInner: integer;
FData: TCongrSystem;
function modinv(u, v: integer): integer; //not relevant
protected
procedure Execute; override;
public
constructor Create(data: TCongrSystem; var result: integer; hasClass: boolean);
end;
我决定使用 TThread
,因为这个类有一个Execute方法,由于构造函数传递的参数长度较长,可能需要一些时间才能完成。下面是实现代码:
constructor TCongruenceSystem.Create(data: TCongrSystem; var result: integer; hasClass: boolean);
begin
inherited Create(True);
FreeOnTerminate := true;
FData := data;
setClass := hasClass;
resInner := result;
end;
procedure TCongruenceSystem.Execute;
var sysResult, i, n, t: integer;
begin
sysResult := 0;
n := 1;
//computation
Queue( procedure
begin
ShowMessage('r = ' + sysResult.ToString);
resInner := sysResult;
end );
end;
问题
如果您查看Queue
,您会发现我正在使用(仅作为测试)ShowMessage,并显示sysResult
的正确值。顺便说一句,第二行存在一些问题,我无法理解。
构造函数有var result:integer
,因此我可以从传递的变量中获得副作用,然后我可以分配resInner:= result;
。最后(在队列中),我将resInner
赋予sysResult的值,并且由于var
的副作用,我期望result
也会被更新。为什么不会发生这种情况?
我进行了另一个测试,将构造函数更改如下:
constructor TCongruenceSystem.Create(data: TCongrSystem; result: TMemo; hasClass: boolean);
//now of course I have resInner: TMemo
将队列更改为这样:
Queue( procedure
begin
ShowMessage('r = ' + sysResult.ToString);
resInner.Lines.Add(sysResult.ToString);
end ); //this code now works properly in both cases! (showmessage and memo)
在构造函数中,我传递的是一个引用 TMemo,这没问题,但是原始的 var result: integer 也被作为引用传递了,为什么它不起作用呢?
我想这样做是因为我想要做类似这样的事情:
//I put var a: integer; inside the public part of the TForm
test := TCongruenceSystem.Create(..., a, true);
test.OnTerminate := giveMeSolution;
test.Start;
test := nil;
在这里,giveMeSolution
是一个简单的过程,它使用包含系统结果的变量a
。如果不可能实现这一点,我该怎么办?基本上,在执行结束时的结果只是一个整数,必须传递给主线程。
我已经阅读了关于ReturnValue
的内容,但我不确定如何使用它。