3

initializationandセクションを持つユニットがありfinalizationます。このユニットには、 でインスタンス化され、initializationで破棄される複雑なオブジェクトが含まれていfinalizationます。ただし、このオブジェクトには ADO 接続も含まれています。ADO は COM であり、スレッドごとに初期化する必要があるため、スレッド間でこれを使用する場合は問題になります。

これは、現在このグローバル オブジェクト インスタンスを処理する方法です。

uses
  ActiveX;
...
initialization
  CoInitialize(nil);
  _MyObject:= TMyObject.Create;
finalization
  _MyObject.Free;
  CoUninitialize;
end.

これはメインスレッドでのみ機能します。他のスレッドはそれにアクセスできず、例外が返されますCoInitialize has not been called

このユニットをスレッドセーフにするためにこれを回避するにはどうすればよいですか? 作成されたスレッドのすべての作成/破棄をフックする方法が必要であり、各スレッドはこのオブジェクトの異なるインスタンスを参照する必要があります。しかし、どうやってそうするのですか?

4

2 に答える 2

4

threadvar別の設計がより良い解決策かもしれませんが、スレッドごとに個別のインスタンスを持つように_MyObject を宣言できます。さらに、CoInitialize/CoUnitialize を TMyObject のコンストラクタ/デストラクタに移動できます。

スレッドがどのように作成および解放されるかがわからないため、これらのインスタンスをいつ作成および解放するかについてアドバイスすることはできません。

于 2013-09-15T07:46:59.860 に答える