gpt4 book ai didi

Delphi TThread 后代返回结果

转载 作者:行者123 更新时间:2023-12-03 15:47:38 26 4
gpt4 key购买 nike

情况。我创建了一个包含一些类的单元来解决代数问题(同余和系统),我向您展示代码:

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;

哪里giveMeSolution只是一个使用变量 a 的简单过程包含系统的结果。如果这不可能,我该怎么办?基本上,执行结束时的结果只是一个必须传递给主线程的整数。

我读过 ReturnValue 但我不知道如何使用它。

最佳答案

Basically the result at the end of Execute is just an integer number that has to be passed to the main thread.

I have read about ReturnValue but I am not sure how to use it.

使用 ReturnValue 属性非常简单:

type
TCongruenceSystem = class(TThread)
...
protected
procedure Execute; override;
public
property ReturnValue; // protected by default
end;

procedure TCongruenceSystem.Execute;
var
...
begin
// computation
ReturnValue := ...;
end;

test := TCongruenceSystem.Create(...);
test.OnTerminate := giveMeSolution;
test.Start;

....

procedure TMyForm.giveMeSolution(Sender: TObject);
var
Result: Integer;
begin
Result := TCongruenceSystem(Sender).ReturnValue;
...
end;

关于Delphi TThread 后代返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45979246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com