2011-01-06 4 views
1

ソケットを介してサーバとクライアントの間で動作するクラス「Tmt」を作成しています。 My Tmtクラスはサーバーからデータを受け取り、内部的にキューを構築し、クライアントが使用できるようになる前にキュー内のデータに対して何らかの操作を実行します。C++でトランスミッタクラスを設計する:サーバからデータをバッファしてクライアントに送信する

私は既にソケット接続をセットアップしており、私は
receiverData()を呼び出すことができます。 //サーバからデータを取得する

クライアントは、次のようにクラスTmtを使用します。
Tmt mytmt = new Tmt();
mymt.getProcessedData(); // 1つのフレームを取得します。

私の質問は、Tmtクラスが作成された後、バックグラウンドでサーバーからデータを受け取り、キューに追加する方法です。私はCのマルチスレッドでいくつかの経験を持っていますが、この「バックグラウンドで作業する」概念がC++のクラスでどのように実装されるのかよくわかりません。アドバイス、ありがとう!

+0

あなたのSOの質問にはその名前を使っても十分ですが、 "Tmt"よりも読みやすいものを使って実際のクラスに名前を付けるのですか? – razlebe

答えて

0

1つのオプションは、(おそらくコンストラクタ内にスレッドを作成することによって)クラスの各インスタンスにスレッドを関連付けることです。このスレッドはネットワークから連続してデータを読み取り、使用可能になったときにそのデータをキューに追加します。スレッドが非公開とマークされている場合(すなわち、クラスクライアントがその存在を認識していない場合)、本質的には明示的な介入なしに「バックグラウンドで」実行されます。その状態を管理するのはオブジェクトTmtまでです。

C++の実際のスレッド実装に関しては、Good olのPthreadsをC++で使うだけで問題ありません。しかし、はるかに良い方法はおそらくBoost threading libraryを使用することです。すべてのスレッド状態をそれ自身のクラスにカプセル化します。また、pthreadのバージョンと同じですが、実質的に使いやすい同期プリミティブを提供しています。

希望すると便利です。

ところで - クラスTransmitの名前を付けることをお勧めします。過度に簡潔な理由はありません。 ;-)

0

IMHOでは、この種のクラスではマルチスレッド化が最適な解決策ではありません。

バックグラウンドスレッドを導入することは多くの問題を引き起こす可能性があります。少なくとも、不要なスレッドを複数作成しないようにする必要があります。また、スレッドは明示的な初期化とクリーンアップが必要です。たとえば、通常のスレッドクリーンアップには、デッドロック、リソースリーク、無責任なUIなどを引き起こすスレッド結合操作(スレッドが停止するのを待つ)が含まれます。

シングルスレッド非同期ソケット通信は、

は、私はこのことについて、サンプルコードを描画してみましょう:

class Tmt { 
... 
public: 
    ... 
    bool doProcessing() 
    { 
     receiverData(); 
     // process data 
     // return true if data available 
    } 

    T getProcessedData() 
    { 
     // return processed data 
    } 
} 

TMTクラスのユーザーはdoProcessing、getProcessedData呼び出しを行うループを実行する必要があります。

Tmt myTmt; 
... 
while (needMoreData) 
{ 
    if (myTmt.doProcessing()) 
    { 
     myTmt.getProcessedData(); 
     ... 
    } 
} 

Tmtユーザーがバックグラウンド処理を希望する場合、別のスレッドを簡単に作成してそこでTmtジョブを実行できます。今回は、スレッド管理作業はTmtユーザーの対象となります。

Tmtユーザーがシングルスレッドアプローチを好む場合は、問題なく実行できます。

また、有名なカールライブラリはこの種のデザインを使用しています。

関連する問題