ソケットクラスで受信後、ダイアログで処理をするには?

解決


メグロ  2007-08-02 05:05:23  No: 65952

VC++6.0 MFC ダイアログベースで作成中です。
ソケットのクラスでデータを受信した場合、ダイアログで受信データを条件として処理を行いたいと思っています。
現状、ソケットクラス:OnReceive()で受信後、ダイアログ:OnTimer()で受信データの確認をする予定でいます。
この方法が良し悪しがわかりません、ご指導をお願い致します。

ソースとしては
<ClientSocket.cpp>
CClientSocket::CClientSocket()
    :
void CClientSocket::OnReceive(int nErrorCode) {
    :
    Receive(char, sizeof(char));  受信データをグローバル変数に代入
    :
}

<Main.cpp>
CMainDlg::CMainDlg(CWnd* pParent)
    :
void CMain::OnTimer(UINT nIDEvent) {
    :
    受信データを条件として処理
    :
}


瀬戸っぷ  2007-08-02 09:20:23  No: 65953

具体的に何やりたいのかよく分かりませんが…

データを受信すればOnReceive()は呼び出されます。
> Receive(char, sizeof(char));
char型1つだけ受信バッファから取り出しているようですが、
2バイト以上受信した場合、次々と上書きされていくことになりますがそれで問題ないのでしょうか?

OnTimer()の精度はそれほど高くないし、OSの都合によっては遅延することもあるようです。
遅延した場合に新たなデータを受信すると上書きされます。
さらに…データを条件判定に使用しても、その直後に書き換わるかも知れません。

ユーザー定義メッセージでダイアログに投げた方がよろしいかと。
(MFC使っていないので、ユーザー定義メッセージのハンドラの辺りとかは不明です。検索すれば見つかると思いますが…)


メグロ  2007-08-02 20:46:04  No: 65954

早速のご回答ありがとうございます。

>具体的に何やりたいのかよく分かりませんが…
ソケット受信データを元に、ダイアログのピクチャボックスに四角を描画したり、消したりなどです。

以下の状況まできましたが、メッセージを投げる方法が不明です。
根本的に間違っていたら、すみません。

<ClientSocket.cpp>
CClientSocket::CClientSocket()
    :
void CClientSocket::OnReceive(int nErrorCode) {
    char charData[100];
    memset(charData, '\0', sizeof(charData));
    Receive(charData, sizeof(charData));
    g_strData = charData;    グローバル変数に代入
}

<MainDlg.h>
    :
#define WM_MYMESSAGE (WM_USER + 101)  追加行
    :
    afx_msg LRESULT OnMyMessage(WPARAM wParam, lParam);  追加行
    DECLARE_MESSAGE_MAP()
};

<MainDlg.cpp>
CMainDlg::CMainDlg(CWnd* pParent)
    :
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
    //{{AFX_MSG_MAP(CMainDlg)
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)    追加行
END_MESSAGE_MAP()
    :
LRESULT CMainDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)  追加関数
{
    処理
}


瀬戸っぷ  2007-08-03 08:12:03  No: 65955

なんらかの方法でCClientSocketクラスのインスタンスにダイアログのHWNDを渡してください。
HWNDからCWndへはCWnd::Attach()で可能かと。
そうすればCWnd::SendMessage()で送れるでしょう。
Win32APIの::SendMessage()でも送れますが。

>    char charData[100];
>    memset(charData, '\0', sizeof(charData));
>    Receive(charData, sizeof(charData));
>    g_strData = charData;    グローバル変数に代入

ローカル変数のアドレスをグローバル変数にコピーしても、正しく動作しないかと。


wclrp ( 'o')  2007-08-03 10:41:06  No: 65956

g_strDataって何の型なのか気になったりします。
動作が違いますからね。
CString g_strData = charData;
char * g_strData = charData;

SendMessageだったら
送り先のウィンドウ(のスレッド)で処理が終わってreturnされるまで
そのSendMessageからreturnされてこないから大丈夫でしょう。

ところで実際に何バイト受け取れたか見たほうがいいですよ。
例として書いているのであって実際はそのあたり考えているかと思いますが念のため。


みい  2007-08-03 20:37:12  No: 65957

MFCなら
AfxGetApp()->m_pMainWnd
でメインウィンドウ(CWnd*)が取得できます。


メグロ  2007-08-04 04:05:03  No: 65958

多数のご指導、ありがとうございます。

>ローカル変数のアドレスをグローバル変数にコピーしても、正しく動作しないかと。
>g_strDataって何の型なのか気になったりします。
  CString型としています。

>ところで実際に何バイト受け取れたか見たほうがいいですよ。
>例として書いているのであって実際はそのあたり考えているかと思いますが念のため。
  OKです。

>AfxGetApp()->m_pMainWndでメインウィンドウ(CWnd*)が取得できます。
出来ました。

m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加