2011-01-23 18 views
0

私はある計算を実行するために2つの異なるデータストリームを使用するプログラムを書いています。私は現在、私のコードは次のように設定している:複数のデータストリームから読み取るプログラムを設計するにはどうすればよいですか?

//pseudo c++ 

class Calculator 
{ 
    //Stream is a class which contains a queue which has new messages added to it 
    Stream a, b; 

    bool BothQueuesHaveItems() { return !a.IsEmpty() && !b.IsEmpty(); } 
    void PerformCalc() { /*Do domething with the first items in a and b*/ } 

}; 


unsigned ThreadFunction(void *stop_event) 
{ 
    Calculator calculator; 

    while(WaitForSingleObject(stop_event) == WAIT_OBJECT_0) 
    { 
     if(calculator.BothQueuesHaveItems()) 
     { 
      calculator.PerformCalc(); 
     } 
     Sleep(5); 
    } 
} 

int main() 
{ 
    Event stop_event = CreateEvent(...); 
    CreateThread(ThreadFunction, &stop_event, ...); 

    //wait for user enter command to stop processing 
    SetEvent(stop_event); 
} 

これは非常に良いデザイン(キューまたはないで新しいアイテムがあるかどうかThreadFunctionで特に連続ループ)のように見えるしていませんが、私は」それを改善する方法が正確にはわかりません。任意の提案をいただければ幸いです。

答えて

0

代わりにIsEmptyを使用しないでください。ストリームから文字を読み取るだけです。文字は準備が整うまで読み込まれません(少なくとも* nixではWindowsについてはわかりません)。

ので

pair <char,char> nextItems() { return make_pair(a.readChar(), b.readChar()); } 

のようなものは、正常に動作する必要があります。

唯一の問題は、stop_eventの実装です。 nextItemsは永遠に待機するので、読み込みコードを別のスレッドに入れ、stop_eventでプロセスを直接終了させる必要があります。

0

私はWin32オーバーラップ(非同期)読み込みを使用するか、ストリームを同期して読み込みをブロックするためにスレッドを作成します。

関連する問題