2012-01-14 6 views
1

私のプロジェクトは、UDPによって受信されたコマンドをキューに保存するジョブサーバです。すべてのコマンドには、実行する間隔値と、削除するタイムアウト値があります。これらのアクションは、2つのプロセスのように、サーバーコードとは独立して動作するタイマーによって制御されます。ソケットとタイマーを互いにブロッキングせずに使用する方法は?

サーバとタイマーをお互いにブロックすることなく動作させるにはどうすればよいですか?私はスレッドや非同期呼び出しについて考えていますが、私はC++には新しく、これらのアイデアを自分のコードにどのように適用するのか分かりません。

私は、Visual C++ 2010とASIOをBoost 1.48から使用しています。

ありがとうございます!

+0

スレッド化は1つの解決策ですが、タイミングイベントの処理に時間がかからないようにするには、単一のメインループとシグナルハンドラを使用してすべてのスレッドを1つのスレッドで実行できます。シングルスレッドプログラミングははるかに簡単で、オプションを検討する価値があります。 –

答えて

1

、ここで紹介したようにあなたは、ブーストASIOと非同期(非ブロッキング)deadline_timerをスケジュールすることができます:http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/tutorial/tuttimer2.html

を私は(あなたが両方を述べたので)すでにあなたのUDP通信用にASIOを使用していると仮定 - 今それはちょうどですあなたのイベントループで必要なタイマーをスケジューリングすることの問題、そしてすべてがうまくいくはずです。

+0

初めて答えを読んだとき、「あなたのイベントループで必要なタイマーをスケジューリングする」という意味はありませんでしたが、コードに投稿したリンクのコードを比較すると、自分のコードの責任を理解できませんでしたスケジューリングを行う。私が間違っていない場合は、私のサーバーがフックしている同じio_serviceにタイマーを接続し、io_serviceにそのジョブをさせるようにしました。ここに質問なしで到達できる簡単な解決策。ありがとう! – MendelGusmao

0

「非ブロッキングソケット」と手動で計算されたタイマー(たとえば、SDLで使用可能なアプリケーションの開始点からのティックを使用)を使用すると、1つのスレッドでこれを実行できるはずですが、CPU使用率が高くなります。

複数のスレッドの方がはるかに優れていますが、これを行う方法は複数あります。 例:http://support.microsoft.com/kb/815805またはlinuxの下のpthreads。

Google for "multithread visual C++ 2010"ではさらに詳しく説明します。

関連する問題