スレッド間通信の結果をCViewクラスで表示 – プログラミング – Home

スレッド間通信の結果をCViewクラス...
 
通知
すべてクリア

[解決済] スレッド間通信の結果をCViewクラスで表示


ペン子
 ペン子
(@ペン子)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

こんばんわ 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クラスの関数を呼ぶ方法は
どうしたらいいでしょうか?

よろしく御願い致します。


引用未解決
トピックタグ
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

> どうしてか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);
}
で出来ると思います。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

あ、マルチドキュメントだった場合は、GetActiveView()ではなく、
GetActiveFrame()->GetActiveView()で

上の書込み、試していないのすが、多分大丈夫だと思います。


返信引用
ペン子
 ペン子
(@ペン子)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

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);
}
で動かしています
よろしく御願い致します。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

す、すみません。やっちまいました。

> CWnd *pWnd=(CWnd*)AfxGetMainWnd()->GetActiveView();
は CWnd *pWnd=(CWnd*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
でした。
多分(汗)

> CWnd *pWnd=(CWnd*)GetActiveFrame()->GetActiveView();
ではなく、*pWnd=(CWnd*)((CMainFrame*)AfxGetMainWnd())->GetActiveFrame()-
>GetActiveView();
という事で書きました。
SDIという事ですから、今回は必要ありませんね。


返信引用
ペン子
 ペン子
(@ペン子)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

いえいえ質問に答えていただいているだけでも感謝なので
ひろぴーさんが謝る必要な全然ないですっ!!

> 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


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

CWnd* pWnd = ((CFrameWnd*)AfxGetApp()->GetMainWnd())->GetActiveView();
コレで行きました。
試してみて下さいませ。


返信引用
ペン子
 ペン子
(@ペン子)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

ありがとうございます!!うまくいきました。
こんなにヒントを貰っているのに自分で解決できなかったあたり
私もまだまだですね

なんだかメッセージが必要以上に来てたり
同期処理がなかったりと直すところは沢山あるのですが
ずっと悩んでいたところが解決できてよかったです!

これから楽しいVC++ライフを送らせていただきます
本当にありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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