如何在继承自CWinThread的UI线程中建立消息循环

hzf0430 2008-05-31 02:39:15

听说要重载RUN但是google到的有用信息是在太少了.

能否给我个详细点的说明,告诉我该如何操作.

比如我添加消息相应
BEGIN_MESSAGE_MAP(Messenger, CWinThread)
ON_WM_TIMER()
END_MESSAGE_MAP()
会提示
error C2440: 'static_cast' : cannot convert from 'void (__thiscall Messenger::* )(UINT)' to 'void (__thiscall CWnd::* )(UINT_PTR)'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

怎么才能建立消息循环呢?
...全文
323 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-05-31
  • 打赏
  • 举报
回复
线程消息要用ON_THREAD_MESSAGE宏来映射。
  • 打赏
  • 举报
回复
lz需要看看windows程序设计。
  • 打赏
  • 举报
回复
Messenger得继承CWnd才可以。
hzf0430 2008-05-31
  • 打赏
  • 举报
回复
结贴.谢谢大家!
scq2099yt 2008-05-31
  • 打赏
  • 举报
回复
up
hzf0430 2008-05-31
  • 打赏
  • 举报
回复

而且我也不是个coder
我也不可能做windows的程序就系统的学win的API,做Linux的程序就系统的学QT,做个网页就系统的学ASP,
如果这些占用了大部分时间,那就失去本来的意义了.
hzf0430 2008-05-31
  • 打赏
  • 举报
回复

MSDN的速度太慢了,冗余信息太多,我甚至觉得不如GOOGLE...

写一个界面响应的时间都快要比我写支持层,数据库,底层驱动的时间还要多了..这开发起来效率太差了.

我的专攻不再这方面阿,真是烦透了,我想调试我的中间键,却不得不花时间来写上层..烦啊.

差不多要准备结贴拉~~
cnzdgs 2008-05-31
  • 打赏
  • 举报
回复
练习查MSDN,在MSDN中查不到再到网上搜索,在MSDN的Index里面输入ON_THREAD_MESSAGE回车就可以了。
GetMessage之后消息就从队列里面移出了。
arong1234 2008-05-31
  • 打赏
  • 举报
回复
你错了,不是什么东西都是快速得到答案就好的,你这样的“快速学习法”只是自找苦吃。这是基础知识,基础只是是不能不学的
再说这个东西你也不应该去Google,MSDN才是正确的地方
至于你这个问题,MSDN有直接的答案,这也是需要问的?
[Quote=引用 12 楼 hzf0430 的回复:]
ON_THREAD_MESSAGE?我去Google一下. 这方面的东西浩如烟海,不可能什么都能精通的呀. 所以要多问问人提高的更快.

不然我看书看很久才能知道要去看ON_THREAD_MESSAGE的内容呀.谢拉.

另外我还是想知道,::GetMessage(&msg,NULL,0,0)之后,消息还在队列里面么??还是被取出来了
[/Quote]
hzf0430 2008-05-31
  • 打赏
  • 举报
回复
ON_THREAD_MESSAGE?我去Google一下. 这方面的东西浩如烟海,不可能什么都能精通的呀. 所以要多问问人提高的更快.

不然我看书看很久才能知道要去看ON_THREAD_MESSAGE的内容呀.谢拉.

另外我还是想知道,::GetMessage(&msg,NULL,0,0)之后,消息还在队列里面么??还是被取出来了
arong1234 2008-05-31
  • 打赏
  • 举报
回复
大家让你去看ON_THREAD_MESSAGE之类的东西你又不去看,光问怎么会明白?“但是我不明白为什么这样做”应该成为激励自己去学习的动力,而不应该是自己去问别人的理由。
arong1234 2008-05-31
  • 打赏
  • 举报
回复
消息循环不需要你建立,CWinThread对象自己就有,人家说的没错
只是你把消息循环和处理消息搞混了。
对话框缺省也不处理这个消息的
至于你说的哪个宏,就好像函数一样,从功能上讲当然那个上下文都可以做某件事情,但是函数和宏都有其可以用的上下文。例如OnTimer只有CWnd有,CWinThread没有,但是不能说CWinThread不能处理CWnd的TiMER消息

问题是:没有窗口,你怎么确保消息被传到这个线程呢?回调函数又没有线程
hzf0430 2008-05-31
  • 打赏
  • 举报
回复

谢谢。

我看到的书上说,建立UI线程要继承CWinThread

而且说没有窗口也可以建立消息循环,貌似是VCbase上面的文章。所以我就用这个了。继承CWnd要怎么做?

那谁能解释下1楼的问题,还有我用了那个Run的重载确实实现了响应,但是我不明白为什么这样做,父类里面的虚函数Run不会处理消息,然后给子类的宏调用么,就像一般的对话框那样子?
hzf0430 2008-05-31
  • 打赏
  • 举报
回复
int CMyThread::Run()
{
MSG msg;
while(::GetMessage(&msg,NULL,0,0))
{
switch(msg.message)
{
case WM_TIMER:
你的处理代码
break;
}
}
if(m_nTimer)
KillTimer(NULL,m_nTimer);
return CWinThread::Run();
}
找到一个文,但前面的问题还是要请大家帮忙教教我的.

另外我想知道,如果在case里 处理了这个WM_TIMER,那么,在响应函数完成之前,线程是不是会一直卡在这里.

另外,经过这个RUN处理过的消息,会被截掉么??比如WM_****被抓到了,虽然case里没有.他会不会进入CWinThread::Run()的处理?

而被处理过的WM_TIMER呢?会不会进也入CWinThread::Run()的处理?
arong1234 2008-05-31
  • 打赏
  • 举报
回复
而且这叫“建立消息映射”,不叫“建立消息循环”,1楼那种代码才叫消息循环
arong1234 2008-05-31
  • 打赏
  • 举报
回复
你说的哪些消息都不是thread的消息,这些都是给窗口做的消息,因此如果你要弄诸如WM_TIMER的消息,你得自己用ON_THREAD_MESSAGE映射,不能用诸如ON_WM_TIMER之类得定义给窗口得宏。

而且:每个宏都有自己得规范,你也不能随便用ON_THREAD_MESSAGE,你得首先看看MSDN看看它得消息处理函数原型如何,该怎么加
CathySun118 2008-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
Messenger得继承CWnd才可以。
[/Quote]
jameshooo 2008-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
Messenger得继承CWnd才可以。
[/Quote]

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧