- PR -

Callback関数について

1
投稿者投稿内容
シチ
会議室デビュー日: 2005/12/16
投稿数: 16
投稿日時: 2005-12-26 09:51
こんにちは。
コンピュータ初心者のシチと申します。
よろしくお願いします。
1つ質問があります。
callback関数内の値を取得したいのですが、
取得することができません。
これはInvokeというものを使用するのですか?
何か良いサイトがあったら教えて頂きたいのですが、
よろしくお願いします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-26 10:31
引用:

シチさんの書き込み (2005-12-26 09:51) より:
こんにちは。
callback関数内の値を取得したいのですが、
取得することができません。
これはInvokeというものを使用するのですか?


言語は何?

「callback関数内の値」とは何のことですか?CallBack関数に渡されている引数が正しくないと言うことですか?だとしたら宣言や呼出し手順を何か間違えているのだと思います。現状のコードを示せば直ぐに解決するでしょう。

それともメンバ変数を参照できないということですか?だたしたら、それは仕様です。Callbackとしている関数は、Staticメンバ関数ですよね。Static関数の仕様に付いて確認してください。
シチ
会議室デビュー日: 2005/12/16
投稿数: 16
投稿日時: 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/16
投稿数: 16
投稿日時: 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/16
投稿数: 16
投稿日時: 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;
}
のようにコーディングしても、値が表示されません。
読みにくいと思いますが、よろしくお願いします。
ありがとうございます。
大変感謝しております。
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2005-12-26 18:54
いつもお世話になっております。

質問の意図がどちらかはっきりしませんが...
回答してみます。

@CallBack内でデータを受信できていないってことですか?
それとも、
ACallBack内でデータは受信できているが、
 受信したデータを画面Form上に表示したいってことですか?


●@の場合の対処

どこが動作していないんでしょうか。

 1.ソケットは接続できていますか?
 2.相手側プロセスから電文は、送信できていますか?
 3.データを受信できていますか?
   (CallBackメソッド内まで処理はきていますか?)

また下記の実装がどうなってるかわからないので、これ以上はよくわかりませんが、
多分MSDNの『非同期ソケットの使用例』とかにある感じっぽいですよね。

・StateObject
・StartClient()

●Aの場合の対処

 StateObjectのメンバにFormへの参照でも入れておいて、
 CallBack内でFormメンバへのアクセス関数を呼んでみてはどうでしょうか?
 ※ただし、ソケット側スレッドとForm(画面)側スレッドは別スレッドですので、
  Invoke()などでマルチスレッド対応にする必要があります。
  (サンプルの動作確認であれば、直接関数Callでも動作するとは思いますけどね)

質問の意図がよくわかりませんでしたので、
的はずれな回答だったら無視してください。
1

スキルアップ/キャリアアップ(JOB@IT)