どのように動作しているかを追うことができませんでした。TThread.CreateAnonymousThreadの奇妙な動作
私の状況をより良く説明しようとすると、まず簡単な例があります。 このコードは、新しいプロジェクトで作成された新しいForm Form1の内部にあります。 mmo1はメモコンポーネントです。
TOb = class
Name : String;
constructor Create(Name : String);
procedure Go();
end;
procedure TOb.Go;
begin
Form1.mmo1.Lines.Add(Name);
end;
そこで私は、このイベントとボタンがあります。
procedure TForm1.btn4Click(Sender: TObject);
var
Index : Integer;
begin
mmo1.Lines.Clear;
for Index := 1 to 3 do
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(Index)).Go).Start;
end;
とメモの私の出力は次のとおりです。
スレッド4
スレッド4
スレッド4
私は本当にそれを持っていない。
最初の質問:なぜ「名前」の出力が次のようになりますか?スレッド4? 1〜3からのループのために少なくとも1または3
セカンドする必要がありますされています。それだけで順番に3回の代わりに、最後のスレッド「スレッド4」を実行なぜ「スレッド1」、「スレッド2」 、 "スレッド3"?
なぜ私はこれを求めていますか?私は既にプロセスが正常に動作しているオブジェクトを持っています。しかし、今私は、このオブジェクトのリストが処理される必要がある状況で私を見つけました。確かに1つずつ細かい作業をしていますが、私の場合は独立しているので、「うーん、スレッドに入れて、もっと速く走らせる」と考えました。私が代わりのTThreadから継承し、匿名スレッドを発見したオブジェクトの手順でスレッドを実行する方法について調べるを実行のTThreadとオーバーライドを拡張するためのオブジェクトを変更避けるため
。 1つのオブジェクトで本当にうまく動作しますが、オブジェクトリストをループすると奇妙な動作が発生します。
これは同じ効果があります。私は、オブジェクトを清掃しないよ
for Index := 1 to 3 do
TThread.CreateAnonymousThread(
procedure
var
Ob : TOb;
begin
OB := TOb.Create('Thread ' + IntToStr(Index));
OB.Go;
end
).Start;
確かに、これは私が実行していただけでいくつかのテストでした。 すべてのアイデア?または、この場合、TThreadから継承し、メソッドを上書きする必要がありますか?
このはうまく動作します。
mmo1.Lines.Clear;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(1)).Go).Start;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(2)).Go).Start;
TThread.CreateAnonymousThread(TOb.Create('Thread ' + IntToStr(3)).Go).Start;
出力:3
これらすべての例は、メインのUIスレッドの外側から 'TMemo'にアクセスしているため、**未定義の動作**を示しています。したがって、結果はすべてランダムになり、予期しない問題が発生する可能性があります。あなたは 'TThread.Synchronize()'のようにメインのUIスレッドと同期する必要があります**。しかし、その場合でも、[匿名プロシージャーが変数にバインドする方法](http://docwiki.embarcadero.com/RADStudio/en/Anonymous_Methods_in_Delphi#Anonymous_Methods_Variable_Binding)を考慮する必要があります。 –
私の場合、オブジェクトを持つObjectListはうまくいくでしょうか?私はビジュアルコンポーネントでデバッグしようとしていたので問題がありますか?この場合Formem1 with TMemo –
おそらくそうではありません。そうでないと、最初にこの質問をしていないでしょう。 –