0

メッセージキューから読み取るクラスがあります。現在、このクラスにはスレッドも含まれています。クラスのメイン スレッドは常に msg q を待機し続けるため、msg q 内の msg のタイプに応じて、そのスレッド内でさまざまな関数を実行する必要があります。キューからメッセージを読み取るとすぐに、そのタイプをチェックし、スレッドで実行される適切なメソッドを呼び出してから、再度読み取りに戻ります (while ループでの読み取り)。

ブースト メッセージ q とブースト スレッドを使用しています。そのようなもの:

while(!quit) {        
    try
    {                        
        ptime now(boost::posix_time::microsec_clock::universal_time());
        ptime timeout = now + milliseconds(100);

        if (mq.timed_receive(&msg, sizeof(msg), recvd_size, priority, timeout))
        {                
            switch(msg.type)
            {
             case collect:
                {
                    // need to call collect method  in thread
                }
                break;                
            case query:
                {
                    // need to call query method  in thread
                }
                break;

等々。それはできますか?

それができれば、スレッドがcollectメソッドを実行していて、メインスレッドがクエリメッセージを取得してそれを呼び出したい場合はどうなりますか。前もって感謝します。

4

1 に答える 1

1

受信スレッドが長い操作を実行している間に到着したメッセージは、後で保存されます (処理されるのを待っているキューに格納されます)。

スレッドが操作を完了すると、スレッドは戻ってきて受信関数を再度呼び出し、見ていない間に到着した最初のメッセージをすぐに取得し、処理することができます。

メイン スレッドがメッセージ処理操作の結果を必要とする場合、ワーカー スレッドが完了して結果を配信するまでブロックされます。

メイン スレッドのアクションを待機するワーカー スレッド内では何もしないでください。そうしないと、デッドロックのリスクがあります。

于 2012-08-25T20:56:54.837 に答える