对于问题一
首先,在MFC中只有继承与CCmdTarget类的对象才拥有消息处理机制,才能接受处理一般消息,只有继承与CWnd类的对象才能够接受Windows消息(WM_COMMAND),比如用户命令。如果你自定义的成员变量不是继承与CCmdTarget类的,它是无法获得消息的,当然不能够处理消息了。
另外,你的线程是用户界面线程还是工作线程,如果是工作线程,它是无法处理用户输入的命令的,比如,按了菜单的命令
先说这些,以后补充
首先,在MFC中只有继承与CCmdTarget类的对象才拥有消息处理机制,才能接受处理一般消息,只有继承与CWnd类的对象才能够接受Windows消息(WM_COMMAND),比如用户命令。如果你自定义的成员变量不是继承与CCmdTarget类的,它是无法获得消息的,当然不能够处理消息了。
另外,你的线程是用户界面线程还是工作线程,如果是工作线程,它是无法处理用户输入的命令的,比如,按了菜单的命令
先说这些,以后补充
但我后来用两种方式解决了这个问题
1.你可以在类中加一个属性:status,设置不同的常数,表示将要进行什么样处理,然后可以在一
个线程中循环访问对象队列,访问:status,然后根据status的值做不同的处理!
2.你可以在住线程中建立要捕获消息的对象实例
1.建立Active Class以封装线程
2.为每个Active Class建立线程安全的消息buffer(采用信号灯pv操作)
3.最好不要显式调用SendMessage(windows API)之类的代码,而将向线程发送消息的工作封装在Active Class的方法(外部接口)实现中,如: void Active::PostMsg(const CSelfDefineMsg& x)
{ p(avail); //非阻塞消息可以不要注释掉
p(mutex);
copy x to buffer;
v(mutex);
v(full); //wake up thread of this Active instance
}
因为thread有自已的stack所以只要上述方法是thread safe.
我现在想这样做:首先从CWinThread类中,派生出线程对象类,CWinThread类是从CCmdTarget类派生来的.所以它可以处理用户发送的自定义消息,在该类中定义对各个自定义信息的处理过程,在系统中定义CWinThread指针类型的数组列表,以保存各个对象的指针,再通过PostThreadMessage()函数向各个对象发送自定义消息.
不过,我有一点不清楚,从CWinThread类生成的线程对象和使用AfxBeginThread()生成的线程有什么不同?当线程很多时,会不会性能方面的问题?
难道从CWinThread派生的类不需要用AfxBeginThread来启动吗?