スレッドの使い方がわかりません

[戻る]
KIM [E-Mail] 2004/01/16(金) 17:15:56
最近visualC++を購入して、簡単なパケットキャプチャのプログラムを作ろうと思い、ネットで
参考になる物を探していたところ下記のページのものを使おうと思いました。 
http://homepage2.nifty.com/spw/tips/PacketDump.html

ここのはC++BUILDERで書かれており、VCで使えるように書き直していたんですけど、キャプチ
ャスレッドのところでつまづいています。

AfxBeginThread関数を使ってスレッド関数のほうに渡して、スレッド(CaptureThreadという関
数)のほうでエディットに情報の書き込みなどをしたいのですが、コントロール変数が使えない
のでうまくいきません。
この場合どうしたらよいでしょうか。どなたかアドバイスのほうよろしくお願いします。

環境 windows2000 visualC++.net MFC

クレイ兄貴 2004/01/16(金) 21:38:36
ハンドルをスレッドに渡して、SendMessageとかでコントロールしたらいいと思う。

KIM [E-Mail] 2004/01/18(日) 20:09:21
クレイ兄貴さん、ありがとうございます。

AfxBeginThreadを使うと書きましたが、ちょっとうまくいかないのでCreateThreadを使うこと
にしました。
自分でレスを見ていろいろやってみたのですが、どうしたらいいかわかりませんでした。
それでハンドルをスレッドに渡すということですがそれはスレッドのハンドルのことでしょう
か?
スレッドは
UINT CaptureThread(LPVOID pParam){
}
として、スレッド作成のCreateThreadは
CreateThread((LPSECURITY_ATTRIBUTES)hThread,0,(LPTHREAD_START_ROUTINE)
CaptureThread,0,0,&ThreadId);
このようにしてみたのですが、どこが間違っているのでしょうか?
また、その後のSendMessageもどのように引数を設定すればよいでしょうか?

てつや 2004/01/18(日) 21:22:17
ここのHPが参考になるかと思います。
http://www.kab-studio.biz/Programing/Codian/MFCTips/11.html

>それでハンドルをスレッドに渡すということですがそれはスレッドのハンドルのことでしょう
か?
違います、エディタのハンドルです

きだ 2004/01/18(日) 21:26:26
DWORD CaptureThread( void *phWnd){  //ThreadProc
  HWND hWnd = (( HWND *)phWnd;
  SendMessage( hWnd, .....);

}

DWORD tid;
HWND hWnd; //ウィンドウのハンドル
CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)CaptureThread, &hWnd, 0, &tid);

でスレッド作成、第4引数に後でメッセージを送りたいウィンドウのハンドルのアドレス
を渡す。
スレッドが作成されるとCaptureThreadが呼ばれるので、そこで引数のハンドル宛に
SendMessageする。
で、どうですか?

KIM 2004/01/19(月) 21:35:15
てつやさん、きださん、ありがとうございます。

きださんの方法でやってみたいと思います。現在あまり余裕がなく時間がかかるかもしれません
が、結果などまた報告させていただきます。

KIM 2004/01/21(水) 16:05:43
きださんの方法で書き、エラーもなく使えたのですが、エディットボックスに出力されません。
そのまま HWND hWnd; で使っていてエディットハンドルの指定をしていませんでした。

エディットボックスはCreateWindowで書いたわけではなく(この場合は hWnd=CreateWindow
()とかでハンドルを渡せると思いますが)、コントロールでダイアログを作ったりしたのでハン
ドルの渡し方がよくわかりません。hWndにはどういった方法でエディットのハンドルを入れ
て、CreateThreadで渡せばいいのでしょうか?エディットコントロールのIDは IDC_EDIT1 
で、ダイアログのIDはIDD_FORM1_FORMです。
クラス内で出力するにはコントロール変数(edit1)を作って 
edit1.SetWindowText(); 
とかでやってエディットにも出力できていました。他に、
CEdit* edit2=(CEdit*)GetDlgItem(IDC_EDIT1); 
edit2->SetWindowText(); 
とかも使ってました。

あとSendMessage()の第二引数も何を指定すればエディットに出力できるのか、自分でも調べま
したがよくわかりませんでした。いつも出力するときは SetWindowText() を使っていたの
で。SetWindowText(hWnd,"出力") のようにしてもダメなんでしょうか?

説明もわかりづらいかと思いますが、アドバイスのほうよろしくおねがいします。

てつや 2004/01/21(水) 18:23:35
>hWndにはどういった方法でエディットのハンドルを入れ
HWNE hwnd = edit1.GetSafeHwnd();

>あとSendMessage()の第二引数も何を指定すればエディットに出力できるのか、
>自分でも調べましたがよくわかりませんでした。
>いつも出力するときは SetWindowText() を使っていたので。
>SetWindowText(hWnd,"出力") のようにしてもダメなんでしょうか?
それでいいと思います

KIM 2004/01/22(木) 15:45:00
てつやさん、ありがとうございます。
やってみましたが、出力されませんでした。
下のように書いてダメだったんですが、他に原因を考えるとしたら何でしょうか?ちなみに
CaptureThreadはちゃんと呼び出されて、中の処理はしてます。AfxMessageBoxで確認しまし
た。

DWORD CaptureThread(void *phWnd)
{
    HWND hWnd=(HWND)phWnd;
    SetWindowText(hWnd,"hwnd");  
     AfxMessageBox("hwnd");      //これは動作してます
}
void CForm1View::OnBnClickedButton1()
{
    DWORD tid;    
    HWND hWnd = edit1.GetSafeHwnd();

         hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)
CaptureThread,&hWnd, 0, &tid);
}

επιστημη [E-Mail] [HomePage] 2004/01/22(木) 15:50:29
引数の受け渡しがデタラメです。

てつや 2004/01/22(木) 17:16:12
επιστημηさんが回答して下さっていますが、引数の受け渡しがダメです。

>hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CaptureThread,&hWnd, 0, 
&tid);
&hWndを渡しているとという事は、CaptureThreadでわたって来るものはHWND*です。
よって、「HWND hWnd=(HWND)phWnd;」ではなく「HWND* hWnd=(HWND*)phWnd;」です。
というより。&hWndを渡すのではなくhWndをそのまま渡した方がいいかと思われます。

KIM 2004/01/22(木) 18:15:58
[[解決]]
επιστημηさん、てつやさん、ありがとうございます。

CreateThreadの引数が間違ってたんですね。おかげで無事出力することができました。
これまで親切にアドバイスしていただけた皆さん、どうもありがとうございました。

古いスレッドには追加発言できません。