はじめまして、よろしくお願いします。
Win2000 or 98, VC6, MFC, ダイアログベースの環境です。
数種類のコマンドを相手に送る方法として、キューを使いたいです。
キューに入れて、先いれ先出しの構成を作りたいのですが、
どうしていいのかわかりません。
追加の仕方や、送ったら削除する方法、キューが空っぽなら
何もしないなどなど。。。
STLを使う場合には、どのコンテナが良くて
どんな方法があるのでしょうか?
概要を教えていただけないでしょうか?
(STLは使ったことがないのですが、この際勉強してみようと
思っています)
ご教授、お願いいたします。
>数種類のコマンドを相手に送る方法として、キューを使いたいです。
list か deque ですね。
末尾に追加はpush_back(), 先頭を削除はpop_front()
空かどうかを調べるのはempty() などなど‥。
あとは、まぁ、自分で調べてみてください。
「数種類のコマンドを相手に送る」とは?
もう少し具体的に書かないと、返事のしようがないのですが。
質問1:タスク間通信のことでしょうか
質問2:コマンドとは何バイト程度のものでしょうか
PIPさん、アイススケーターさん お返事ありがとうございます。
>list か deque ですね。
調べてみます。
>「数種類のコマンドを相手に送る」とは?
ソケットで他の機器と通信します。
コマンドとは、昨日の情報をください とか 今日の情報をください とかです。
送る時間帯が重なる恐れがあるので、キューを使いたいと思いました。
>質問2:コマンドとは何バイト程度のものでしょうか
20バイト程度です。
引き続き、情報をお待ちしています。
よろしくお願いします。
STL についてなら、この方を紹介する以外にはないですね。
http://www02.so-net.ne.jp/~epi-/
επιστημη's homepage
こちらの「別館」→「C++ Technical Documents」→「コンテナの種類による計算量の相違」
がコンテナの相違について詳しいです。
> 送る時間帯が重なる恐れがあるので、キューを使いたいと思いました。
いまいちどういう事がわからないです。シリアルにコマンドを送りたいという事なんでしょう
か。そうなると、スレッドを使っていて同時にコマンドを発効したりする場合がある、という
ことなのでしょうか。
ハリィさん お返事ありがとうございます。
>そうなると、スレッドを使っていて同時にコマンドを発効したりする場合がある、
>ということなのでしょうか。
非同期でソケットを使っています。
ひとつは、タイマーである時間がきたら、コマンドaを送信します。
それとは別に、あるボタンを押されたら、コマンドbを送信したいです。
で、まず接続し、その後送信となると思いますけれど
(非同期なので)FD_CONNECTの通知が来たときに、コマンドaを送るべきなのか
コマンドbを送るべきなのかわかりません。
なので、キューの先に入っているコマンドを送りたいのです。
そのときにどういう方法を用いるのか、さっぱり検討がつきません。
わかりずらい説明ですみません。
よろしければアドバイスをお願いします。
> なので、キューの先に入っているコマンドを送りたいのです。
> そのときにどういう方法を用いるのか、さっぱり検討がつきません。
class command { .... };
std::list<command> que; // commandのキュー
command x = que.back(); que.pop_back(); // キューの末尾から取り出す
こういうプログラムの1例を書きます。
まず、送信用のスレッドを作って、
1.キューにデータがあるか確認。
2.キューにデータがあるならデータ送信
の繰り返しにします。
キューはεπιστημη様の書かれたようなクラスにして、
キューへの登録・削除などの操作は同期オブジェクトを使った
排他制御を入れてやれば、タイマーであろうと
ボタンであろうと、好きなタイミングでキュークラスに
アクセスできます。
お返事遅くなりました。
ご回答をいただき、ありがとうございます。
>まず、送信用のスレッドを作って、
>1.キューにデータがあるか確認。
>2.キューにデータがあるならデータ送信
>の繰り返しにします。
スレッドにする必要性がわかりません。
このスレッドはワーカースレッドになるのでしょうか?
また、データ送信後、スレッドは終了するのでしょうか?
>キューはεπιστημη様の書かれたようなクラスにして、
>キューへの登録・削除などの操作は同期オブジェクトを使った
>排他制御を入れてやれば、タイマーであろうと
>ボタンであろうと、好きなタイミングでキュークラスに
>アクセスできます。
このクラスはどこからでもアクセスできるグローバルなものに
する必要があるのでしょうか?
よろしければ、ご回答をお願いいたします。
よこから失礼
>スレッドにする必要性がわかりません。
非同期動作ですから無理にスレッドにする必要性はないのかもしれません。
ただ、
この方法は不必要にCPUを消費するので、WindowsのMFCプログラムなら
スレッドを使用して同期動作にするのが一般的と思います。
通信用スレッドにはユーザインタフェーススレッドが使いやすいです。
スレッドするメリットは同期通信のブロッキング処理を簡素化するという
メリットのほか、キューを中継ポイントとしてメッセージ処理を、
ソケット側とアプリ側で分離するといった機能分割にも役立ち、
ソースもきれいになります。
どちらが構造上きれいかと考えれば、スレッドにするほうが、
メリットが大きいと思います。
>このクラスはどこからでもアクセスできるグローバルなものに
>する必要があるのでしょうか?
スレッドを分ける場合は、排他制御をいれないとぶつかっちゃい
ますから こうゆうことも考慮しないとダメということですね。
スレッドも排他制御も使ってみればめちゃめちゃ簡単です。
皆様、ご回答ありがとうございました。
よくわからない部分が多いので、もう少し勉強して出直してきます。