- - PR -
Callback関数について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-26 09:51
こんにちは。
コンピュータ初心者のシチと申します。 よろしくお願いします。 1つ質問があります。 callback関数内の値を取得したいのですが、 取得することができません。 これはInvokeというものを使用するのですか? 何か良いサイトがあったら教えて頂きたいのですが、 よろしくお願いします。 | ||||
|
投稿日時: 2005-12-26 10:31
言語は何? 「callback関数内の値」とは何のことですか?CallBack関数に渡されている引数が正しくないと言うことですか?だとしたら宣言や呼出し手順を何か間違えているのだと思います。現状のコードを示せば直ぐに解決するでしょう。 それともメンバ変数を参照できないということですか?だたしたら、それは仕様です。Callbackとしている関数は、Staticメンバ関数ですよね。Static関数の仕様に付いて確認してください。 | ||||
|
投稿日時: 2005-12-26 10:44
ご返信誠にありがとうございます。
言語はC#を使っています。 初心者であんまりよくわからないのですが。 すいません。 private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject) ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); state.ReceivedData.Write(state.buffer, 0, bytesRead); if(client.Available == 0) { string response = Encoding.UTF8.GetString(state.ReceivedData.ToArray()); Console.WriteLine(response); state.ReceivedData.Close(); state.ReceivedData = new MemoryStream(); } client.BeginReceive(state.buffer, 0,StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch(Exception exception) { Console.WriteLine(exception.ToString()); } } 非同期通信により、サーバーからの受信文字を表示させたいのですが、 このメソッド内の得られた受信文字のresponseの値を別のメソッド内で使用したいです。 しかし、例えばテキストボックスに表示するために private void button1_Click(object sender, System.EventArgs e) { StartClient(); this.richTextBox1.Text = response; } のようにコーディングしても、値が表示されません。 読みにくいと思いますが、よろしくお願いします。 ありがとうございます。 大変感謝しております。 | ||||
|
投稿日時: 2005-12-26 10:44
ご返信誠にありがとうございます。
言語はC#を使っています。 初心者であんまりよくわからないのですが。 すいません。 private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject) ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); state.ReceivedData.Write(state.buffer, 0, bytesRead); if(client.Available == 0) { string response = Encoding.UTF8.GetString(state.ReceivedData.ToArray()); Console.WriteLine(response); state.ReceivedData.Close(); state.ReceivedData = new MemoryStream(); } client.BeginReceive(state.buffer, 0,StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch(Exception exception) { Console.WriteLine(exception.ToString()); } } 非同期通信により、サーバーからの受信文字を表示させたいのですが、 このメソッド内の得られた受信文字のresponseの値を別のメソッド内で使用したいです。 しかし、例えばテキストボックスに表示するために private void button1_Click(object sender, System.EventArgs e) { StartClient(); this.richTextBox1.Text = response; } のようにコーディングしても、値が表示されません。 読みにくいと思いますが、よろしくお願いします。 ありがとうございます。 大変感謝しております。 | ||||
|
投稿日時: 2005-12-26 10:44
ご返信誠にありがとうございます。
言語はC#を使っています。 初心者であんまりよくわからないのですが。 すいません。 private static void ReceiveCallback(IAsyncResult ar) { try { StateObject state = (StateObject) ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); state.ReceivedData.Write(state.buffer, 0, bytesRead); if(client.Available == 0) { string response = Encoding.UTF8.GetString(state.ReceivedData.ToArray()); Console.WriteLine(response); state.ReceivedData.Close(); state.ReceivedData = new MemoryStream(); } client.BeginReceive(state.buffer, 0,StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch(Exception exception) { Console.WriteLine(exception.ToString()); } } 非同期通信により、サーバーからの受信文字を表示させたいのですが、 このメソッド内の得られた受信文字のresponseの値を別のメソッド内で使用したいです。 しかし、例えばテキストボックスに表示するために private void button1_Click(object sender, System.EventArgs e) { StartClient(); this.richTextBox1.Text = response; } のようにコーディングしても、値が表示されません。 読みにくいと思いますが、よろしくお願いします。 ありがとうございます。 大変感謝しております。 | ||||
|
投稿日時: 2005-12-26 18:54
いつもお世話になっております。
質問の意図がどちらかはっきりしませんが... 回答してみます。 @CallBack内でデータを受信できていないってことですか? それとも、 ACallBack内でデータは受信できているが、 受信したデータを画面Form上に表示したいってことですか? ●@の場合の対処 どこが動作していないんでしょうか。 1.ソケットは接続できていますか? 2.相手側プロセスから電文は、送信できていますか? 3.データを受信できていますか? (CallBackメソッド内まで処理はきていますか?) また下記の実装がどうなってるかわからないので、これ以上はよくわかりませんが、 多分MSDNの『非同期ソケットの使用例』とかにある感じっぽいですよね。 ・StateObject ・StartClient() ●Aの場合の対処 StateObjectのメンバにFormへの参照でも入れておいて、 CallBack内でFormメンバへのアクセス関数を呼んでみてはどうでしょうか? ※ただし、ソケット側スレッドとForm(画面)側スレッドは別スレッドですので、 Invoke()などでマルチスレッド対応にする必要があります。 (サンプルの動作確認であれば、直接関数Callでも動作するとは思いますけどね) 質問の意図がよくわかりませんでしたので、 的はずれな回答だったら無視してください。 |
1