2

Delphi のマルチスレッドについて質問があります。スレッドがあり、いくつかのクラスがあり、いくつかの作業を行い、同期が必要であるとします。どうすればそれを作ることができますか?私はこの手順を作成します(ThreadClassで):

procedure TThreadClass.SynchProc(P: TProc);
begin
 ...
 Synchronize(TThreadProcedure(P));
 ...
end;

そして、スレッドで実行されているクラスから呼び出しますが...プロシージャシンボルでは、「同期化」はTThreadのメソッド、つまりオブジェクト「(Self as TThread)」ですが、クラスからprocを呼び出すと、変数「Self」には、my ThreadClass オブジェクトが含まれていません (含まれていることはわかりませんが、Thread で実行されている 2 番目のクラスのオブジェクトである可能性があります)。それぞれ、その手順は機能しません。他のバリアントを検索します (threadClass オブジェクトを 2 番目のクラス オブジェクトに渡し、2 番目のクラスのプロシージャから "同期" プロシージャを呼び出そうとしましたが、コンパイラはそれをコンパイルしませんでした)。

手伝って頂けますか?どんな助けにも感謝します

ウクライナからのご挨拶 PS 下手な英語でごめんなさい

4

1 に答える 1

4

100% 理解しているとは言えませんが、このような状況があると思います。あなたにはTThread子孫がいますTMyThreadTThreadClassそして、そのクラスは、から派生していないという名前の別のクラスを順番に使用しTThreadます。Synchronizeのメソッドから呼び出したいTThreadClass

以下にいくつかのオプションを示します。

  1. TThreadインスタンスを に渡しますTThreadClass。これは、問題に対するかなり残忍な解決策です。TThreadClassやりたいことが call だけの場合、スレッドに対して何でもできるようになりましたSynchronize
  2. Synchronizeメソッドを参照する手続き型変数を に渡しますTThreadClass。これによりTThreadClass、必要なことだけを実行できるようになります。
  3. 最初のパラメーターTThread.Synchronizeを渡すクラス メソッドを呼び出します。nil

これらのうち、最後のオプションが最も簡単です。次のように実行できます。

procedure TThreadClass.SynchProc(P: TThreadProcedure);
begin
  TThread.Synchronize(nil, P);
end;

質問のコードに従ってa を渡してTProcキャストすることはお勧めできません。TThreadProcedure呼び出し元に正しい型の手続き型変数を渡すように強制します。この場合、キャストは良性ですが、常にキャストを避けるように努める必要があります。

于 2013-01-19T13:42:39.557 に答える