キューを実現したい – プログラミング – Home

通知
すべてクリア

[解決済] キューを実現したい


JoJo
 JoJo
(@JoJo)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

はじめまして、よろしくお願いします。

Win2000 or 98, VC6, MFC, ダイアログベースの環境です。

数種類のコマンドを相手に送る方法として、キューを使いたいです。
キューに入れて、先いれ先出しの構成を作りたいのですが、
どうしていいのかわかりません。
追加の仕方や、送ったら削除する方法、キューが空っぽなら
何もしないなどなど。。。

STLを使う場合には、どのコンテナが良くて
どんな方法があるのでしょうか?

概要を教えていただけないでしょうか?
(STLは使ったことがないのですが、この際勉強してみようと
思っています)

ご教授、お願いいたします。


引用未解決
トピックタグ
PIP
 PIP
(@PIP)
ゲスト
結合: 22年前
投稿: 16
 

>数種類のコマンドを相手に送る方法として、キューを使いたいです。

list か deque ですね。

末尾に追加はpush_back(), 先頭を削除はpop_front()
空かどうかを調べるのはempty() などなど‥。

あとは、まぁ、自分で調べてみてください。


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

「数種類のコマンドを相手に送る」とは?

もう少し具体的に書かないと、返事のしようがないのですが。

質問1:タスク間通信のことでしょうか
質問2:コマンドとは何バイト程度のものでしょうか


返信引用
JoJo
 JoJo
(@JoJo)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

PIPさん、アイススケーターさん お返事ありがとうございます。

>list か deque ですね。

調べてみます。

>「数種類のコマンドを相手に送る」とは?

ソケットで他の機器と通信します。
コマンドとは、昨日の情報をください とか 今日の情報をください とかです。
送る時間帯が重なる恐れがあるので、キューを使いたいと思いました。

>質問2:コマンドとは何バイト程度のものでしょうか

20バイト程度です。

引き続き、情報をお待ちしています。
よろしくお願いします。


返信引用
ハリィ
 ハリィ
(@ハリィ)
ゲスト
結合: 22年前
投稿: 14
 

STL についてなら、この方を紹介する以外にはないですね。

http://www02.so-net.ne.jp/~epi-/
επιστημη's homepage

こちらの「別館」→「C++ Technical Documents」→「コンテナの種類による計算量の相違」
がコンテナの相違について詳しいです。

> 送る時間帯が重なる恐れがあるので、キューを使いたいと思いました。
いまいちどういう事がわからないです。シリアルにコマンドを送りたいという事なんでしょう
か。そうなると、スレッドを使っていて同時にコマンドを発効したりする場合がある、という
ことなのでしょうか。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

すんません、それちょっと旧い。

http://www005.upp.so-net.ne.jp/episteme/


返信引用
JoJo
 JoJo
(@JoJo)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

ハリィさん お返事ありがとうございます。

>そうなると、スレッドを使っていて同時にコマンドを発効したりする場合がある、
>ということなのでしょうか。

非同期でソケットを使っています。
ひとつは、タイマーである時間がきたら、コマンドaを送信します。
それとは別に、あるボタンを押されたら、コマンドbを送信したいです。

で、まず接続し、その後送信となると思いますけれど
(非同期なので)FD_CONNECTの通知が来たときに、コマンドaを送るべきなのか
コマンドbを送るべきなのかわかりません。

なので、キューの先に入っているコマンドを送りたいのです。
そのときにどういう方法を用いるのか、さっぱり検討がつきません。

わかりずらい説明ですみません。
よろしければアドバイスをお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> なので、キューの先に入っているコマンドを送りたいのです。
> そのときにどういう方法を用いるのか、さっぱり検討がつきません。

class command { .... };

std::list<command> que; // commandのキュー

command x = que.back(); que.pop_back(); // キューの末尾から取り出す


返信引用
恵比寿帝冥
 恵比寿帝冥
(@恵比寿帝冥)
ゲスト
結合: 22年前
投稿: 6
 

こういうプログラムの1例を書きます。

まず、送信用のスレッドを作って、
1.キューにデータがあるか確認。
2.キューにデータがあるならデータ送信
の繰り返しにします。

キューはεπιστημη様の書かれたようなクラスにして、
キューへの登録・削除などの操作は同期オブジェクトを使った
排他制御を入れてやれば、タイマーであろうと
ボタンであろうと、好きなタイミングでキュークラスに
アクセスできます。


返信引用
JoJo
 JoJo
(@JoJo)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

お返事遅くなりました。
ご回答をいただき、ありがとうございます。

>まず、送信用のスレッドを作って、
>1.キューにデータがあるか確認。
>2.キューにデータがあるならデータ送信
>の繰り返しにします。

スレッドにする必要性がわかりません。
このスレッドはワーカースレッドになるのでしょうか?
また、データ送信後、スレッドは終了するのでしょうか?

>キューはεπιστημη様の書かれたようなクラスにして、
>キューへの登録・削除などの操作は同期オブジェクトを使った
>排他制御を入れてやれば、タイマーであろうと
>ボタンであろうと、好きなタイミングでキュークラスに
>アクセスできます。

このクラスはどこからでもアクセスできるグローバルなものに
する必要があるのでしょうか?

よろしければ、ご回答をお願いいたします。


返信引用
汎
 汎
(@汎)
ゲスト
結合: 22年前
投稿: 43
 

よこから失礼

>スレッドにする必要性がわかりません。
非同期動作ですから無理にスレッドにする必要性はないのかもしれません。

ただ、
この方法は不必要にCPUを消費するので、WindowsのMFCプログラムなら
スレッドを使用して同期動作にするのが一般的と思います。

通信用スレッドにはユーザインタフェーススレッドが使いやすいです。

スレッドするメリットは同期通信のブロッキング処理を簡素化するという
メリットのほか、キューを中継ポイントとしてメッセージ処理を、
ソケット側とアプリ側で分離するといった機能分割にも役立ち、
ソースもきれいになります。

どちらが構造上きれいかと考えれば、スレッドにするほうが、
メリットが大きいと思います。

>このクラスはどこからでもアクセスできるグローバルなものに
>する必要があるのでしょうか?
スレッドを分ける場合は、排他制御をいれないとぶつかっちゃい
ますから こうゆうことも考慮しないとダメということですね。

スレッドも排他制御も使ってみればめちゃめちゃ簡単です。


返信引用
JoJo
 JoJo
(@JoJo)
ゲスト
結合: 22年前
投稿: 5
Topic starter  

皆様、ご回答ありがとうございました。
よくわからない部分が多いので、もう少し勉強して出直してきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました