情况。我创建了一个包含一些类的单元来解决代数问题(同余和系统),我正在向您展示代码:
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 的值,并且result
由于var
. 为什么这不会发生?
我做了另一个测试,改变了这样的构造函数:
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;
WheregiveMeSolution
只是一个简单的过程,它使用a
包含系统结果的变量。如果这是不可能的,我该怎么办?基本上 Execute 结束时的结果只是一个整数,必须传递给主线程。
我已经阅读过ReturnValue
但我不知道如何使用它。