2

Mongoose Web サーバー ライブラリを使用してマルチスレッド サーバー アプリケーションを作成しようとしています。接続を提供し、独自のスレッドで動作しているプロセッサに要求を送信するメイン スレッドがあります。次に、プロセッサは結果をキューに入れ、キュー オブザーバは結果をクライアントに送り返す必要があります。

ソースはそのように見えます:

ここでは、プロセッサ用のデータを準備し、キューに配置します。

typedef std::pair<struct mg_connection*, const char*> TransferData; 


int server_app::event_handler(struct mg_connection *conn, enum mg_event ev)
{
    Request req;
    if (ev == MG_AUTH) 
        return MG_TRUE;   // Authorize all requests
    else if (ev == MG_REQUEST) 
    {
        req = parse_request(conn);
        task_queue->push(TransferData(conn,req.second));
        mg_printf(conn, "%s", "");  // (1)
        return MG_MORE;  // (2)
    }
    else
        return MG_FALSE;  // Rest of the events are not processed
}

そして、ここで結果を送り返そうとしています。この関数は独自のスレッドで動作しています。

void server_app::check_results()
{
    while(true)
    {
        TransferData res;
        if(!res_queue->pop(res))
        {
            boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
            continue;
        }
        mg_printf_data(res.first, "%s", res.second); // (3)
    }
}

問題は、クライアントがサーバーから何も受信しないことです。
タスクをキューに配置した後、event_handler で check_result 関数を手動で実行し、計算結果を event_handler に渡すと、mg_printf_data を使用してクライアントに送信できます (MG_TRUE を返します)。他の方法 - 私は違います。

このソースを機能させるには、正確に何を変更する必要がありますか?

4

1 に答える 1