こんばんわ Win98とVC6++でプログラムを作っております。
スレッド間通信の勉強をしているのですがちょっと詰まってしまいました。
子スレッド側で
void ThreadDebugPut(char *Msg)
{
CWnd *pWnd=AfxGetMainWnd();
pWnd->PostMessage(WM_THREAD_DEBUG_PRINT, 0, 0);
}
として親スレッド側にメッセージを送っています。
受け取ってCViewクラスでその旨を表示させたいのですが
どうしてかCMainFrmクラスの方でしか受け取れません。
仕方がないのでCmainFrmクラスの方で受け取って
CViewクラスの関数
void CKaoGuiView::OnDebugPrint(char *Msg)
{
AfxMessageBox(main Threadにメッセージが来た);
}
の関数を呼びたいのですが、どうしていいかわかりません
Cviewクラスにメッセージを送る方法はないのでしょうか?
また、MainFrmクラスからCViewクラスの関数を呼ぶ方法は
どうしたらいいでしょうか?
よろしく御願い致します。
> どうしてかCMainFrmクラスの方でしか受け取れません。
AfxGetMainWnd()はCMainFrameクラスのポインタですので、挙動は合っています。
> 仕方がないのでCmainFrmクラスの方で受け取って
> CViewクラスの関数
> void CKaoGuiView::OnDebugPrint(char *Msg)
> {
> AfxMessageBox(main Threadにメッセージが来た);
> }
> の関数を呼びたいのですが、どうしていいかわかりません
CMainFrameクラスのメッセージマップにON_MESSAGEでWM_THREAD_DEBUG_PRINTに対応させ、
GetActiveView()でCViewのポインタを取得し、関数を呼びます。
> Cviewクラスにメッセージを送る方法はないのでしょうか?
> また、MainFrmクラスからCViewクラスの関数を呼ぶ方法は
> どうしたらいいでしょうか?
void ThreadDebugPut(char *Msg)
{
CWnd *pWnd=(CWnd*)AfxGetMainWnd()->GetActiveView();
pWnd->PostMessage(WM_THREAD_DEBUG_PRINT, 0, 0);
}
で出来ると思います。
あ、マルチドキュメントだった場合は、GetActiveView()ではなく、
GetActiveFrame()->GetActiveView()で
上の書込み、試していないのすが、多分大丈夫だと思います。
void ThreadDebugPut(char *Msg)
{
CWnd *pWnd=(CWnd*)AfxGetMainWnd()->GetActiveView();
pWnd->PostMessage(WM_THREAD_DEBUG_PRINT, 0, 0);
}
はCwndのメンバじゃないらしく駄目でした
void ThreadDebugPut(char *Msg)
{
CWnd *pWnd=(CWnd*)GetActiveFrame()->GetActiveView();
pWnd->PostMessage(WM_THREAD_DEBUG_PRINT, 0, 0);
}
はGetActiveFrame()が定義されていない識別子らしくて駄目らしいです
SDIでダイアログもないのでマルチドキュメントではないと思います
スレッドは
void CKaoGuiView::OnSrvStart()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
//スレッドはすでに動いているか?
if (!m_pThread) {
m_pThread=::AfxBeginThread(RUNTIME_CLASS
(CSrvThread),THREAD_PRIORITY_NORMAL,100000,CREATE_SUSPENDED);
m_pThread->m_bAutoDelete=FALSE;
m_pThread->ResumeThread();
}
//スタートのメッセージを送る
if (m_pThread) m_pThread->PostThreadMessage(WM_THREAD_SRV_START,0,-1);
}
で動かしています
よろしく御願い致します。
す、すみません。やっちまいました。
> CWnd *pWnd=(CWnd*)AfxGetMainWnd()->GetActiveView();
は CWnd *pWnd=(CWnd*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
でした。
多分(汗)
> CWnd *pWnd=(CWnd*)GetActiveFrame()->GetActiveView();
ではなく、*pWnd=(CWnd*)((CMainFrame*)AfxGetMainWnd())->GetActiveFrame()-
>GetActiveView();
という事で書きました。
SDIという事ですから、今回は必要ありませんね。
いえいえ質問に答えていただいているだけでも感謝なので
ひろぴーさんが謝る必要な全然ないですっ!!
> CWnd *pWnd=(CWnd*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
のままだとCMainFrameが未定義でコンパイルが通らなかったので
CWnd *pWnd=(CWnd *)((CFrameWnd *)AfxGetMainWnd())->GetActiveView();
にしてコンパイルは通りました。
でも、GetActiveView()関数内の
ASSERT(m_pViewActive == NULL || m_pViewActive->IsKindOf(RUNTIME_CLASS(CView)));
で強制終了してしまいます。
CView *pWnd=(CView *)((CFrameWnd *)AfxGetMainWnd())->GetActiveView();
にしても同じです・・・
なかなか難しいですねぇ~
よろしくお願い致します。m(_ _)m
CWnd* pWnd = ((CFrameWnd*)AfxGetApp()->GetMainWnd())->GetActiveView();
コレで行きました。
試してみて下さいませ。
ありがとうございます!!うまくいきました。
こんなにヒントを貰っているのに自分で解決できなかったあたり
私もまだまだですね
なんだかメッセージが必要以上に来てたり
同期処理がなかったりと直すところは沢山あるのですが
ずっと悩んでいたところが解決できてよかったです!
これから楽しいVC++ライフを送らせていただきます
本当にありがとうございました。