2011-12-20 20 views
0

私はC++とMFCを使ってリアルタイムでBloombergから情報を引き出すアプリケーションを作成しています。ブルームバーグAPIにはサブスクリプションクラスがあり、ブルームバーグからのアップデートを「購読」してリアルタイムで自分のPCにプッシュするので、ブルームバーグデータを処理するスレッドでイベントループを実行する必要があります。MFCでマルチスレッドを実装して、外部関数からアクセス可能な内部ディクショナリを更新する

帯域幅を節約するために、Bloombergティッカーを最後の価格にマッピングするために辞書を使用したいので、同じティッカーで複数の結果を取得する代わりに(つまり、同じティッカーを複数回使用します)プログラムは辞書内で検索を行います。そうすれば、私は別個のティッカーに加入すればよい。

以前はマルチスレッドで作業していませんでしたが、私はMSDNのドキュメントを読んでいましたが、私は何をする必要があるかを理解するのに苦労しています。

私の理解に基づいて、AfxBeginThread()を使用してワーカースレッドを作成し、辞書のインスタンスへのポインタを渡す必要があります。ワーカースレッドは、プログラムの残りの部分が実行されている間、辞書を更新します。

この辞書はスレッドによってロックされていますか?更新中に安全にアクセスできますか?

プログラムが終了するまでスレッドをバックグラウンドで実行しておくことはできますか?プログラムを終了すると明示的にスレッドを強制終了する必要がありますか?それとも自動的に終了しますか?

これは正しいですか、何か根本的なものがありませんか?

私はテロップと価格設定を保存するCMap(CString、LPCSTR、double、double)を作成しました。 私はLPVOIDを介してCMapへのポインタを渡し、CMapはリアルタイムで更新されます。これはすべて今働いている。私はCMap内の変数を検索し、リアルタイム価格を得ることができます。

しかし、今はスレッドセーフではありません。 CMapに書き込むスレッドは1つしかなく、他のものはCMapのデータを読み込んでいるだけなので、今は大きな問題ではありません。

しかし、良いプログラミングプラクティスを学ぶために、私はCMapに書き込むときにCEventを使うべきですか? CEventをスレッドに渡す必要がありますか?私はこれがどのように実装されているのか分かりません。私はすばやいgoogle検索を行いました。スレッド内の変数をロックしたりアンロックする方法について私が理解しているものは見つかりませんでした。

+0

この質問は非常に幅広く、どのくらいの助けを得るのかはわかりません。私はあなたに始めようとする答えの中で私のベストショットを与えましたが、その答えを読んで試してみるのが最善のアドバイスです。あなたが_specific_質問を返信できるなら、あなたは援助を得る可能性がさらに高くなります。 – Chad

答えて

1

スレッドセーフであるように特に設計されていないオブジェクトはそうではありません。したがって、あなたはあなたの「辞書」のアクセスを保護するいくつかのミューテックスオブジェクトが必要になります。

// for example, HINT CCriticalSection, or CSemaphore 
mutex.lock(); 
dictionary.add(...); 
mutex.unlock(); 

ドキュメントは上記の場合CSemaphoreを示唆するだろうが、CCriticalSectionは(私の意見では)初心者のため理解しやすいです。

アプリケーションが起動するスレッドは、アプリケーションによって停止する必要があります。これを行うには、作業が完了したスレッドに信号を送ります。

// for example, HINT CEvent 
while(!stopped) 
{ 
    do_work(); 
} 

アプリケーション終了時にstoppedイベントを設定します。

まずはhereを読んでください。正直なところ、これらはかなり基本的な質問ですが、実際にこのことをよく学ぶために時間を費やす用意があります。適切なマルチスレッドコードを書くのが簡単だったら、誰もがそれをやるでしょう。

私が言及した特定の同期クラスについては、hereと記載されています。

関連する問題