C♯相談室 Part7

C#のスレッド&TCP通信回りの勉強をかねて、簡単なチャット
プログラムを作っているのですが、1つ問題が出てきました。
システムの構成としては、チャットクライアントとチャット
サーバがあって、複数のチャットクライアントがチャットサーバ
に接続して通信を行います。

チャットクライアントでは、GUIの入力受付と、通信は別スレッドで
行っているのですが、通信スレッド側で、次のよに、読み込み状態に
してしまうと、そこで処理がブロッキングしてしまうのです。

size = networkStream.Read(data, 0, 1);

この場合、GUIで入力した内容を通信スレッドに渡しても、Readで
ブロッキング状態になっているため、サーバ側からなんらかの値が
送られてこない限り、GUIで入力した情報を送信する処理に移行して
くれないのです。

こういう場合は、どのようにプログラムを組めばいいのでしょうか?

1つのnetworkStreamを2つの通信スレッドで、送信受信に分けて
動かせばなんとかなりそうなのですが、できれば通信スレッドは1つ
ですっきりさせたいのです。

何かいい方法はあるでしょうか?
>>586
BeginReadで非同期で読む
>>584
見てみたけど無理じゃないの?
589572:02/08/23 02:14
>>588 そうですか・・・(´・ω・`)ショボーン
>>584
ネイティブのEDITでも不可。
自前でコントロール作るしかない。
591586:02/08/23 02:22
>>587
BeginReadで非同期にした場合、そのスレッド内では、受信データが
来る来ないに関係なく永久ループの処理をやって、「受信データある?」
「送信データある?」っていう処理を引っ切り無しに行うことになると
思うのですが、、、

でも、そうすると、すぐCPU負荷100%になってしまうんじゃないんでしょうか?

MFCのイベント駆動みたいに、受信したら、受信処理。
送信したいデータがあったら送信処理。
それ以外はイベント発生まで待機。みたいにできないのでしょうか?
>>591
そうはならん、Readのところでとまるだけだ。
593586:02/08/23 02:36
>>592
それじゃ、非同期じゃなくて、普通のReadじゃないですか。

その場合は、結局 >>586 のようなことになってしまうっす。
594586:02/08/23 02:38
ちなみに、今java関係のチャットのサンプルをあさってみたら、
どうも、送受信で非同期っぽい処理を行う場合には、受信用スレッド
と送信用スレッドに分けて、実装しているようです。

結局、1つのnetworkStreamを2つのスレッドで送信・受信に分けて
実装するのが、正攻法ということなのでしょうか?