マルチスレッドにしなければダメですか?

[戻る]
まみ 2008/02/28(木) 11:26:17
VisualC++6.0, WindowsXP, MFC, Dialog の環境

はじめまして
これからプログラムをつくろうと考えています。
つくってから失敗したらたいへんなので、先に質問いたします。

ソケット通信で一度に大量のデータを収集したいのですが、
時間がかかるので「中止ボタン」を貼り付けておいて中止できるようにしたいです。
こんな時はマルチスレッドでプログラムしないとダメなのでしょうか?
マルチスレッドにする場合には、送信と受信のスレッドを別々にしたほうが良いです
か?
スレッドって扱ったことがないし、まだ初心者なので、
わかりやすく教えて頂けると嬉しいです。よろしくお願いします。

επιστημη [HomePage] 2008/02/28(木) 11:37:13
> つくってから失敗したらたいへんなので、先に質問いたします。

いきなり本番コード書いたらそりゃたいへんだけど、
お試しコード書けばやり直し効くやないですか。

1対1の通信ならシングル・スレッドで十分なことも多いです。
受信/送信可能となったときイベント投げてくれるOS(たとえばWindows)
だったらなお楽ちん。

まみ 2008/02/28(木) 11:50:44
επιστημηさん

お返事ありがとうございます。

> お試しコード書けばやり直し効くやないですか。

その通りなのですけど、エディットボックスをやっと操作できるようになったレベルな
ので、お試しするだけでもたいへんなのです ***(>_<)***
ソケットもスレッドも ちんぷんかんなので。

シングルスレッドで、いっぱい通信中に「中止」ボタンをなかなか押せない
ということはないのでしょうか?

επιστημη [HomePage] 2008/02/28(木) 11:55:23
> その通りなのですけど、エディットボックスをやっと操作できるようになったレベル> ので、お試しするだけでもたいへんなのです ***(>_<)***

そのレベルでお試しやらずにいきなり本番だと256倍(当社比)たいへんですよ?

> シングルスレッドで、いっぱい通信中に「中止」ボタンをなかなか押せない
> ということはないのでしょうか?

かどうかをお試しすんですよ。

επιστημη [HomePage] 2008/02/28(木) 13:19:10
...と突き放しっぱではァレなので。

プロトコルが大きく関与するんですよ。
"データくれ!"と言った途端に大量のデータをダラダラ送りつけられるなら
ちょいと厳しいかもしれない。けれど"次のデータくれ!"と要求するたびに
ブツ切りにしたカタマリを送ってくるのなら、"次のデータくれ!"と言わな
ければ送信側は待ちに入るのだから十分対処できるでしょう。

でかいデータをダラダラ送りつけてくるにしても、"データが到着した"イベント
の隙間に"キャンセルボタンが押された"イベントが割りこんでくれるなら
そのイベントに反応して受信を停止すりゃええわけで。

そんなこんなを"お試し"してはいかがでしょうか。

PATIO 2008/02/28(木) 13:21:37
マルチスレッドにしてもソケット通信にしても覚えといて損はないと思うので
一度に何でもやろうとしないでまずはソケット通信をシングルスレッドで組んで見て
やり取りを行う為にはどうしたら良いかを確認。

マルチスレッドも簡単な物を組んで見て動作を確認。

というようにステップを踏んで試した方が良いです。

両方の動きがわかってきたらマルチスレッドでソケット通信を
するのを試してみる。

何かを実現する時に一度で正解に近づこうするのは難しいので
うまくステップを分けて一つずつクリアすると良いと思いますよ。

subaru 2008/02/28(木) 14:30:43
MFCで利用できるソケットクラスには同期ソケットと非同期ソケットの2種類があります。
前者を利用する場合は送受信処理を別スレッドにしなければ
処理を中断することはできません。
後者の場合、送受信中にアプリケーションがブロックされることはないので
επιστημηさんの方法でOKです。

まみ 2008/02/28(木) 15:07:11
[[解決]]
ダメモトでがんばってみます。

ぱっちょさん
 いろいろと覚えていこうと思います。

すばるさん
 非同期ソケットですネ 調べてみます。

皆様アドバイスありがとうございました ***△*(*^-^*)*△***

επιστημη [HomePage] 2008/02/28(木) 15:11:32
やるだけやって思うように動かなんだら、
ここで愚痴れば誰か聞いてくれますよ♪

まみ 2008/02/28(木) 15:44:13
επιさん

> やるだけやって思うように動かなんだら、
> ここで愚痴れば誰か聞いてくれますよ♪

ありがとうございます、まず自分でがんばってみます。

「ボタンサイズ変更」 読んじゃいました、 いろいろとたいへんデスネ (^_^)

わからなかったらまた来ますので、よろしくお願いします。m(__)m

επιστημη [HomePage] 2008/02/28(木) 15:49:53
...ただねー、Visual C++ 6.0 だと"僕んとこでも動いたよ/ダメみたいよ"って
追試できるヒトがかなり減ってます。自分のせいじゃないトコでトラブって
microsoftに訴えても"サポート切れてます"で一蹴されるでしょう。

質問に答えてくれる方々の多くがVC++6を捨ててます。それが気がかり。

まみ 2008/02/28(木) 16:20:55
> 質問に答えてくれる方々の多くがVC++6を捨ててます。それが気がかり。

今月から配属がかわり、念願のプログラマーになれたんです。
上司は短期間でいろいろできるようになり、プログラマーらしくなれたなら
新しいバージョンを購入してくれると言っています。

がんばります (*^_^*)

仲澤@失業者 2008/02/28(木) 16:23:48
クローズしましたが、

> 質問に答えてくれる方々の多くがVC++6を捨ててます。それが気がかり。

ポーティングの予算がど〜たらで、まだしばらくは仕事で VC6.0 を使ってます。
いいかげんやめたい(笑)。

επιστημη [HomePage] 2008/02/28(木) 16:26:29
それはめでたい。応援するよー♪

となるとMFCならまずは非同期ソケット: CAsyncSocket あたりからいじくってみるです
ね。
そんなに難しくありません。一旦ソケットが開けばファイルの読み書きと似たよなも
ん。

まみ 2008/02/28(木) 17:01:52
> いいかげんやめたい(笑)。

やめないで!!!(大笑)
困ります。

ここって、面白い方がいっぱいいますネ (*^_^*)

> それはめでたい。応援するよー♪

ありがとうございます。

> MFCならまずは非同期ソケット: CAsyncSocket あたりからいじくってみるですね。

CAsyncSocket ですね、調べてみます。

> 一旦ソケットが開けばファイルの読み書きと似たよなもん。

ファイルも難しくて苦手なんです (>_<)
向いてないのかなぁ、私。

ではまた〜 ***(*^_^*)***

p 2008/02/28(木) 17:13:53
CSocket + CFile + CArchiveの組み合わせでプログラムを組むのは
避けたほうがいいです。
データ受信の方法が間違っているのでしばらく送受信したあとで
データが到着しても受信イベントが発生しなくなります。
VC++6でコンパイルしたものは比較的ましに動きますが、
VC++2005/2008でコンパイルしなおしたものだとちょっと動かした
だけですぐ受信が止まります。

#自作アプリでもVC++6に付属のchatter/chatsrvrサンプルでも受信は止まる。
#chatter/chatsrvrはVC++2005/2008にはもう附属されなくなった。

MFCはかなりよくできたライブラリだと思いますが、
CSocket + CFile + CArchiveの抽象化についてはたぶん設計ミス。

επιστημη [HomePage] 2008/02/28(木) 17:33:32
> CSocket + CFile + CArchiveの組み合わせでプログラムを組むのは
> 避けたほうがいいです。

それは裏返せば CSocket/CAsyncSocket だけ使ってるうちは無問題てことですか?

p 2008/02/28(木) 17:55:30
>それは裏返せば CSocket/CAsyncSocket だけ使ってるうちは無問題てことですか?
↓のような批判もありますが、
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/csocket.html
僕がソースを読んだ限りでは概ね(?)大丈夫なんじゃないかと思います。
CAsyncSocketのほうは割と薄いWinSockラッパーなので、そちらのほうが
お勧めかなぁ〜。
自作ソフトはMFCを使うわけにはいかない別の事情ができて、骨組みから大改造。
CAsyncSocketの仕組みを真似たSocketクラスを自作しちゃいましたけど。

p 2008/02/28(木) 18:14:54
補足です。

>CAsyncSocketのほうは割と薄いWinSockラッパーなので、そちらのほうが
>お勧めかなぁ〜。
CSocketのブロック型模倣の問題はマルチスレッドにすれば
解決するというものではないので、少なくともサーバー側用途
としては使わないほうがよさそうに思います。

古いスレッドには追加発言できません。