2011-01-11 9 views
3

これは簡単な作業のようですが、OmniThreadLibraryを使用して開始する方法はわかりません。OmniThreadLibraryを使用してスレッド変数にアクセスするには?

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

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

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

答えて

3

OTLでの所有者/スレッドのデータ共有は直接サポートされていません。なぜなら、私のマルチスレッド化されたすべての経験から、これは常に悪いことです。

2番目のmghieの提案に従うべきです(オプションでインターフェイスベースのオブジェクトを作成し、このオブジェクト(またはそのインターフェイス)を糸。このような何か:

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

労働者:

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

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

2

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

編集:

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

+0

私はこのデモを理解しているので、新しい結果が出るたびに、その結​​果をメインスレッドに返します。私の場合、メインスレッドは、オペレータが更新ボタンを押すと現在の値を取得するだけでよい。新しい値が作成されるのは1000回ごとです。主スレッドが必要なときにだけ値を読み取ることができるなら、それはより良いでしょう。 – Holgerwa

関連する問題