将消息机制封装到类中,该如何处理
将消息机制封装到类中
近日看到一个网友的帖子,不免也产生了一些疑问,提出如下问题:
请看如下代码:
这样的话,只要在 main 函数中如下写:
int main()
{
CTest obj; //不需要再mian中加while(TRUE)循环,obj就一直会存活
return 0;
}
请问这么写,会带来哪些问题?
我想到的一个问题:
如何给这个类 发送 WM_QUIT 消息,终止消息环
------解决方案--------------------
不会遇到什么问题,但是你这样不太符合C++的编程思想。
类,最好都是名词词性。
如果你的类对象的出现是以动词词性的形式存在,你的这个设计在程序变得复杂之后就会变得不好了。
根据你这个形式,我觉得这样写会清楚一点点。
class ui_vthread
{
public:
void wait();
};
这个类含义上是一个UI线程,如果你是将当前线程作为UI线程,那么可以假设这个ui_thread是一个虚拟的UI线程,这个虚拟线程和当前线程是同一个真实线程。你的程序等待这个线程的语义也完全没有问题。因此可以将消息循环放在wait里面做。
------解决方案--------------------
消息循环有好几种形式,我对GetMessage记得不太清楚了,下面的说法有一点点想当然。
WM_QUIT通常是界面操作产生的。产生了WM_QUIT消息之后,消息循环的GetMessage函数就会返回0从而结束while块。
你要终止消息循环,只需要结束这个while就好了,和WM_QUIT毫无关系。
个人认为将WM_QUIT作为结束消息循环的标志并不好,经验做法是为一个UI线程维护一个引用计数。每一个从属于这个UI线程的窗口创建引用UI线程对象一次,销毁则解引用一次。当UI线程对象的引用计数为0时自动退出消息循环。这样的话无论是多个顶级窗口还是一个顶级窗口都完全没有问题。你可以开任意多个窗口,只有当所有的窗口都关闭才会结束消息循环。
------解决方案--------------------
你这个问题不存在,不用给类发,他自己构造函数中就能接受WM_QUIT。
而且你这个是windows程序,一般不应该是main启动。
MFC也是类似的思想
近日看到一个网友的帖子,不免也产生了一些疑问,提出如下问题:
请看如下代码:
class CTest
{
public:
CTest()
{
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
DispathMessage(&msg);
TranslateMessage(&msg);
}
}
~CTest(){}
private:
static void CALLBACK TimerProc(HWND, UINT, UINT, DWORD);
}
这样的话,只要在 main 函数中如下写:
int main()
{
CTest obj; //不需要再mian中加while(TRUE)循环,obj就一直会存活
return 0;
}
请问这么写,会带来哪些问题?
我想到的一个问题:
如何给这个类 发送 WM_QUIT 消息,终止消息环
------解决方案--------------------
不会遇到什么问题,但是你这样不太符合C++的编程思想。
类,最好都是名词词性。
如果你的类对象的出现是以动词词性的形式存在,你的这个设计在程序变得复杂之后就会变得不好了。
根据你这个形式,我觉得这样写会清楚一点点。
class ui_vthread
{
public:
void wait();
};
这个类含义上是一个UI线程,如果你是将当前线程作为UI线程,那么可以假设这个ui_thread是一个虚拟的UI线程,这个虚拟线程和当前线程是同一个真实线程。你的程序等待这个线程的语义也完全没有问题。因此可以将消息循环放在wait里面做。
------解决方案--------------------
消息循环有好几种形式,我对GetMessage记得不太清楚了,下面的说法有一点点想当然。
WM_QUIT通常是界面操作产生的。产生了WM_QUIT消息之后,消息循环的GetMessage函数就会返回0从而结束while块。
你要终止消息循环,只需要结束这个while就好了,和WM_QUIT毫无关系。
个人认为将WM_QUIT作为结束消息循环的标志并不好,经验做法是为一个UI线程维护一个引用计数。每一个从属于这个UI线程的窗口创建引用UI线程对象一次,销毁则解引用一次。当UI线程对象的引用计数为0时自动退出消息循环。这样的话无论是多个顶级窗口还是一个顶级窗口都完全没有问题。你可以开任意多个窗口,只有当所有的窗口都关闭才会结束消息循环。
------解决方案--------------------
你这个问题不存在,不用给类发,他自己构造函数中就能接受WM_QUIT。
而且你这个是windows程序,一般不应该是main启动。
MFC也是类似的思想