スレッドの使い方がわかりません – プログラミング – Home

スレッドの使い方がわかりません
 
通知
すべてクリア

[解決済] スレッドの使い方がわかりません


KIM
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

最近visualC++を購入して、簡単なパケットキャプチャのプログラムを作ろうと思い、ネットで
参考になる物を探していたところ下記のページのものを使おうと思いました。 
http://homepage2.nifty.com/spw/tips/PacketDump.html

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

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

環境 windows2000 visualC++.net MFC


引用未解決
トピックタグ
クレイ兄貴
 クレイ兄貴
(@クレイ兄貴)
ゲスト
結合: 21年前
投稿: 1
 

ハンドルをスレッドに渡して、SendMessageとかでコントロールしたらいいと思う。


返信引用
KIM
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

クレイ兄貴さん、ありがとうございます。

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


返信引用
てつや
 てつや
(@てつや)
ゲスト
結合: 21年前
投稿: 34
 

ここのHPが参考になるかと思います。
http://www.kab-studio.biz/Programing/Codian/MFCTips/11.html

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


返信引用
きだ
 きだ
(@きだ)
ゲスト
結合: 22年前
投稿: 32
 

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
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 29
 

てつやさん、きださん、ありがとうございます。

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


返信引用
KIM
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 29
 

きださんの方法で書き、エラーもなく使えたのですが、エディットボックスに出力されません。
そのまま 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,出力) のようにしてもダメなんでしょうか?

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


返信引用
てつや
 てつや
(@てつや)
ゲスト
結合: 21年前
投稿: 34
 

>hWndにはどういった方法でエディットのハンドルを入れ
HWNE hwnd = edit1.GetSafeHwnd();

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


返信引用
KIM
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 29
 

てつやさん、ありがとうございます。
やってみましたが、出力されませんでした。
下のように書いてダメだったんですが、他に原因を考えるとしたら何でしょうか?ちなみに
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);
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

引数の受け渡しがデタラメです。


返信引用
てつや
 てつや
(@てつや)
ゲスト
結合: 21年前
投稿: 34
 

επιστημηさんが回答して下さっていますが、引数の受け渡しがダメです。

>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
 KIM
(@KIM)
ゲスト
結合: 21年前
投稿: 29
 

επιστημηさん、てつやさん、ありがとうございます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました