狀態。我已經創建了一個單元的一些類來解決代數的東西(同餘和系統),我顯示你的代碼:德爾福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;
我已經決定使用TThread
因爲這個類有一個執行可能需要一些時間的方法由於傳遞給構造函數的參數的長度而結束。下面是執行:
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;
問題
如果你看你看,我使用(就像測試)的ShowMessage和它顯示的sysResult
正確的值Queue
。順便提一下,第二行有一些我無法理解的問題。
構造函數有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
包含系統的結果的簡單過程。如果這是不可能的,我該怎麼辦?基本上,Execute結尾的結果只是一個必須傳遞給主線程的整數。
我已閱讀約ReturnValue
但我不確定如何使用它。
這個設計很糟糕,你應該早比晚解決它。當然這裏沒有任何東西應該來自TComponent。這沒有意義。更大的問題是在該組件中構建線程。這應該由代碼的使用者來處理。 –
@DavidHeffernan感謝您的評論。我想用這個做一個組件;閱讀你的建議我認爲我應該刪除線程的東西,並簡單地添加一個系統解決問題的類函數。 –
該組件毫無意義。這是一個數字類。你不需要它在設計表面上。 –