3

これは簡単な作業のようです。OmniThreadLibraryの使用を開始する方法がわかりません。

バックグラウンドで処理を行うタスクを作成します。結果はタスククラスのフィールドに保存され、新しい値で継続的に入力されます。

ここで、メインスレッドはこれらのフィールドを読み取り、それらの値を時々表示したいと考えています。
したがって、これらのフィールドにアクセスし、これらの時点で書き込まれないようにする必要があります(同期)。

OmniThreadLibraryでこれをどのように行うことができますか?

4

2 に答える 2

3

OTLでの所有者/スレッドデータ共有の直接サポートはありません。これは、私のマルチスレッドの経験から、これは常に悪いことであることがわかっているためです。(同意します。それが唯一の解決策である場合もありますが、それでも悪いことです。)

2番目のmghieの提案に従う必要があります-(オプションでインターフェイスベースの)オブジェクトを作成し、このオブジェクト(またはそのインターフェイス)をスレッドに渡します。このようなもの:

sharedData := TSharedData.Create;
task := CreateTask(worker).SetParameter('shared', sharedData).Run;

ワーカー:

sharedData := Task.Param['shared'].AsObject as TSharedData;

この問題を解決する別の方法は、ユーザーがUpdateNowボタンを押すたびに、「更新を送信してください」というメッセージをタスクに送信することです。そのタスクは、現在の状態を含むオブジェクトで応答します。ただし、タスクが長時間の中断できない計算を実行する場合、このソリューションは実際には適切ではなく、共有状態アプローチの方が適切に機能します。

于 2011-01-11T17:33:19.117 に答える
2

バックグラウンドファイル検索を実装するOTLテスト23を確認してください。このSetParameter()メソッドは検索プロパティを設定するために使用され、Commチャネルは結果をメインスレッドに転送するために使用されます。通信はすでにスレッドセーフであるため、それ以上の同期を実装する必要はありません。

編集:

プッシュモデルではなくプルモデルが必要な場合は、もちろん標準の同期ツールを使用できます。これは、同時アクセスからデータを保護するためにすべてのアクセサーで使用されるクリティカルセクションを持つオブジェクトです。このオブジェクトは、タスクオブジェクト自体、またはGUIスレッドによって作成され、(再度)を呼び出すことによってタスクに渡される任意の3番目のオブジェクトである可能性がありますSetParameter()。オブジェクトを使用せずにインターフェイスポインタを使用すると、破棄の順序が重要でなくなるため、安全性が高まります。データを保持しているオブジェクトは、実装するインターフェイスへの最後の参照がリセットされた場合にのみ破棄されます。

于 2011-01-11T16:13:48.297 に答える