状況。私は、このクラスには時間がかかる可能性があり、Executeメソッドを持っているのでTThread
を使用することを決定したDelphi TThread子孫リターン結果
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;
:私は代数のもの(合同式とシステムを)解決するためにいくつかのクラスでユニットを作成している、私はあなたのコードを示していますコンストラクタに渡されるパラメータの長さのために終了します。ここでは実装です:
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;
PROBLEM
あなたはQueue
を見ればあなたは、私が(ちょうどテストとして)ShowMessageを使用していますが、それはsysResult
の正しい値を示していることがわかります。途中で2番目の行には、私が理解できないいくつかの問題があります。
コンストラクタはvar result: integer
です。したがって、渡された変数から副作用があり、次にresInner := result;
を割り当てることができます。最後(キュー内)にはresInner
にsysResultの値が与えられており、var
という副作用のためにresult
も更新されると予想しています。なぜこれは起こりませんか?
私はこのようなコンストラクタを変更し、別のテスト作っています、私は参照して、[OKである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)
:
constructor TCongruenceSystem.Create(data: TCongrSystem; result: TMemo; hasClass: boolean);
//now of course I have resInner: TMemo
そして、これにキューを変更します元のものではありませんvar result: integer
あまりにも参考として渡されますか?なぜそれは機能しませんか?
私はこのような何かしたいと思いますので、私はこれをしたい:giveMeSolution
は、システムの結果を含む変数a
を使用して単純な手順である
//I put var a: integer; inside the public part of the TForm
test := TCongruenceSystem.Create(..., a, true);
test.OnTerminate := giveMeSolution;
test.Start;
test := nil;
を。これができない場合、私は何ができますか?基本的にExecuteの最後の結果は、メインスレッドに渡されなければならない整数です。
私はReturnValue
について読んだことがありますが、使用方法がわかりません。
これはひどい設計されており、あなたは遅かれ早かれよりもそれを修正する必要があります。確かにここではTComponentから派生するものはありません。それは無意味です。より大きな問題は、コンポーネントにスレッドを構築することです。それはコードの消費者によって処理されるべきです。あなたのコメントのために@DavidHeffernanありがとう –
。私はこれでコンポーネントを作りたかったのです。あなたの提案を読んでください私はスレッドのものを削除し、単にシステムが処理するクラス機能を追加するべきだと思います。 –
コンポーネントは無意味です。これは数値クラスです。デザイン面には必要ありません。 –