VisualC++6.0 で質問があります。
SendMessage関数の定義は
SendMessage(HWND hWnd,・・・)となっていますが、
メンバ変数にm_hWndを持たないAppクラスやDocクラスに
メッセージを送ることはできるのでしょうか。
また、その場合CViewクラスにメッセージを送る場合と
異なる点はありますでしょうか。
ワーカースレッドからユーザー定義メッセージを送り、
Appクラスのハンドラで処理したいと思っています。
それとも、メッセージは CWnd クラスや CView クラス
で受け取って、そこから目的クラスのメンバ関数を使用す
るのが普通のやり方なのでしょうか。
よろしくお願いします。
>ワーカースレッドからユーザー定義メッセージを送り、
>Appクラスのハンドラで処理したいと思っています。
いやぁ~、思いつきませんですぅ。hWndがないっすからねェ。(^^;
なぜ、Appクラスで処理されたいのでしょうか?
ハンドラ関数とは、どんな時に処理するもの?
> なぜ、Appクラスで処理されたいのでしょうか?
> ハンドラ関数とは、どんな時に処理するもの?
・Appクラスでワーカースレッドを生成する
・ワーカースレッド終了時に終了メッセージをAppクラスに送る
・Appクラスのメッセージハンドラで新たなワーカースレッドを生成する。
という処理を実現したいと思っていました。
上記処理のAppクラスをウィンドウクラスに換えれば問題なさそうですが、
メッセージはあくまでもウィンドウクラスでしか受け取れないという認識
でよろしいのでしょうか。
>メッセージはあくまでもウィンドウクラスでしか受け取れないという認識
>でよろしいのでしょうか。
正しいかわかりませんが、私はそういう認識をしています。
ワーカースレッドを立てた理由は何でしょうか?
前回の質問内容からだけでは、わざわざスレッドを立てる必要はないように思えます。
> ワーカースレッドを立てた理由は何でしょうか?
前回の質問では関係のないコードは省かせて頂きました。
ワーカースレッドでは、実際にはインターネットからファイルを
ダウンロードしています。時間の掛かる処理になると思いました
ので、ワーカースレッドを試しています。
UINT ThreadFunc(LPVOID pParam)
{
hSession = InternetOpen();
hFile = InternetOpenUrl();
while(1) {
InternetReadFile();
if (読込み終了) break;
/*---- 中略 ----*/
::PostMessage(hWnd, (WM_USER + 100), 0, 0);
// 再描画はうまくいっていますが、チラチラします。
// 頻繁に更新し過ぎでしょうか。
}
InternetCloseHandle(hFile);
InternetCloseHandle(hSession);
// ここで終了メッセージをAPPクラスに送ろうとしました。
return 0;
}
以上です。
よろしくお願いします。
MassageMap中定義及びOnScan関数
ON_THREAD_MESSAGE(WM_THREAD_SCAN , OnScan)
コルの場合
while(!PostThreadMessage(theApp.m_nThreadID ,WM_THREAD_SCAN, 0,0))
Sleep(10);
どう設計するかにもよるのでしょうけど (^^;
結果をViewに反映させるわけですし
私でしたら Viewで処理します。
haogegeさんにご提案頂いた方法により、Appクラスでもメッセージ(?)が受け取れる
ことが確認できました。ただ、Appクラスで処理しなければならない理由は特にありま
せんので、どのクラスで処理するのが一番スマートかについてこれから考えていきたい
と思います。
色々と勉強になりました。
Bunさん、haogegeさん、ありがとうございました。