请教熟消息映射机制的朋友一个关于怎样发送消息的问题。

CYQ_96 2001-07-09 09:32:43
听说CWinThread类的对象能有自己的消息循环,因此我生成了一个新类,继承自CWinThread类,并且给它映射了一个我自定义的消息,但在想给该类的对象发送消息时,却不道该给::PostMessage函数的第一个参数赋什么值。
其实我只是想要一个类,它的每一个实例对象都能处理发给它的消息,是不是该沿着这条思路做?若不对,具体应该怎么做呢?
...全文
151 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CYQ_96 2001-07-11
  • 打赏
  • 举报
回复
重申一下我的问题:
我只是想要一个类,它的每一个实例对象都能处理发给它的消息。
也就是说,我想要使该类的每一个实例都有一个它自己的线程(各个实例对象能并行运行),当然都要在它自己的线程中有一个消息循环,以处理外界发送给它的消息。
听说CWinThread类的对象能有自己的消息循环,以它为基类自定义了一个派生类,并在该类中映射了一个自定的消息MY_MESSAGE,还指定了处理该消息的函数ONMYMESSAGE()。于是我就用该类生成了一个实例对象,想向其发送一个MY_MESSAGE消息,看看ONMYMESSAGE()函数有没有响应。
可是在我用::PostThreadMessage()函数向其发送这个消息时,却不知它的第一个参数(接收消息的线程的ID)应该给什么值?
至于我是如何映射自定义消息以及如何指定此消息的响应函数的这个问题,我的步骤如下:
1. 在在StdAfx.h中添加自定义的消息:
#define MY_MESSAGE WM_USER +101
2. 在函数要实现类的头文件中里添加定义消息处理函数说明:
afx_msg void ONMYMESSAGE( UINT nID, LPARAM lParam );
3.在函数要实现的.cpp中添加函数消息影射和函数体:
ON_MESSAGE(MY_MESSAGE, ONMYMESSAGE)
4.然后是添加函数实体.我只是打开了一个MessageBox而已。

请各路大侠会诊一下,给俺提个建议。
不解 2001-07-11
  • 打赏
  • 举报
回复
何苦呢?从CWnd衍生一个类不就行了?全部都是现成的。
tianya 2001-07-11
  • 打赏
  • 举报
回复
你的线程是如何创建的那,创建的时候会得到线程ID,如下

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes
DWORD dwStackSize, // initial thread stack size
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to receive thread ID
);

令,CWinThread 的成员 m_nThreadID ,保存线程ID,可以作为 ::PostThreadMessage()函数的第一个参数(接收消息的线程的ID)

其实你既然从CWinThread 那就不如直接用它的成员函数,如下面方式投递消息

(CMyThread *) m_pThread = (CMyThread *)AfxBeginThread(RUNTIME_CLASS( CMyThread ));

得到指向线程对象地指针,然后当发送消息时,调用。

m_pThread ->PostThreadMessage(MY_MESSAGE,nID,lParam);
CYQ_96 2001-07-11
  • 打赏
  • 举报
回复
Is anyone here?
CYQ_96 2001-07-11
  • 打赏
  • 举报
回复
Can anyone answer this question?
CYQ_96 2001-07-11
  • 打赏
  • 举报
回复
这个问题真难啊!一天都没人回答。
下面宣布加分!
NewFoundFriend 2001-07-11
  • 打赏
  • 举报
回复
No one can answer this question?
plato 2001-07-10
  • 打赏
  • 举报
回复
::PostThreadMessage的第一个参数是Thread线程的ID。
CWinThread::PostThreadMessage因为CWinThread的成员包括了ID,不需要再次指明,因此与::PostThreadMessage相比,少了ID参数。
wang_xiao_jian 2001-07-10
  • 打赏
  • 举报
回复
如果使用CWinThread::PostThreadMessage,第一个参数message是消息。这个CWinThread实例是消息的接收者(也许应该叫CWinThread::ReceiveMessageThatPostToMe)。
如果使用::PostThreadMessage,第一个参数idThread是接收消息的线程的ID。调用_beginthreadex或CreateThread成功后,最后一个参数将返回线程ID的地址。
vlmf 2001-07-10
  • 打赏
  • 举报
回复
你要没有消息的thread你就用api写嘛!
 
 cwinthread 中向不线程发message可以直接用postthreadmessage, 
plato 2001-07-10
  • 打赏
  • 举报
回复
用消息的话,等于系统帮你同步了,因为你的Thread只能在一个时刻处理一个消息,从而避免了重入问题。

怎样建立的CWinThread没有消息循环?我不知道,问问熟悉MFC的同志吧。
AriDo 2001-07-10
  • 打赏
  • 举报
回复
to: plato(天天)
从CWinThread下继承的线程都可以给其发消息吗?那么线程同步企不是很简单吗,还有控制线程结束。怎样建立的线程没有消息循环呢?
不解 2001-07-10
  • 打赏
  • 举报
回复
说开了就是VC++的封装类函数与WIN API 函数之间的区别.一般来说经过封装的类成员函数有一个隐含的this指针.
CYQ_96 2001-07-09
  • 打赏
  • 举报
回复
但是PostThreadMessage()函数的第一个参数该传什么值呢?是不是.m_hThread,好象不行。
wang_xiao_jian 2001-07-09
  • 打赏
  • 举报
回复
最好使用PostThreadMessage()
xyzboat 2001-07-09
  • 打赏
  • 举报
回复
Use ::PostThreadMessage().

::PostMessage posts a message to a meassage to a Window. HWND handle is a handle to a window.

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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