C#のスレッド&TCP通信回りの勉強をかねて、簡単なチャット
プログラムを作っているのですが、1つ問題が出てきました。
システムの構成としては、チャットクライアントとチャット
サーバがあって、複数のチャットクライアントがチャットサーバ
に接続して通信を行います。
チャットクライアントでは、GUIの入力受付と、通信は別スレッドで
行っているのですが、通信スレッド側で、次のよに、読み込み状態に
してしまうと、そこで処理がブロッキングしてしまうのです。
size = networkStream.Read(data, 0, 1);
この場合、GUIで入力した内容を通信スレッドに渡しても、Readで
ブロッキング状態になっているため、サーバ側からなんらかの値が
送られてこない限り、GUIで入力した情報を送信する処理に移行して
くれないのです。
こういう場合は、どのようにプログラムを組めばいいのでしょうか?
1つのnetworkStreamを2つの通信スレッドで、送信受信に分けて
動かせばなんとかなりそうなのですが、できれば通信スレッドは1つ
ですっきりさせたいのです。
何かいい方法はあるでしょうか?
>>588 そうですか・・・(´・ω・`)ショボーン
>>584 ネイティブのEDITでも不可。
自前でコントロール作るしかない。
>>587 BeginReadで非同期にした場合、そのスレッド内では、受信データが
来る来ないに関係なく永久ループの処理をやって、「受信データある?」
「送信データある?」っていう処理を引っ切り無しに行うことになると
思うのですが、、、
でも、そうすると、すぐCPU負荷100%になってしまうんじゃないんでしょうか?
MFCのイベント駆動みたいに、受信したら、受信処理。
送信したいデータがあったら送信処理。
それ以外はイベント発生まで待機。みたいにできないのでしょうか?
>>591 そうはならん、Readのところでとまるだけだ。
>>592 それじゃ、非同期じゃなくて、普通のReadじゃないですか。
その場合は、結局
>>586 のようなことになってしまうっす。
ちなみに、今java関係のチャットのサンプルをあさってみたら、
どうも、送受信で非同期っぽい処理を行う場合には、受信用スレッド
と送信用スレッドに分けて、実装しているようです。
結局、1つのnetworkStreamを2つのスレッドで送信・受信に分けて
実装するのが、正攻法ということなのでしょうか?