一个自定义的消息,发送给UI线程的。打算是:用PostThreadMessage发,用ON_THREAD_MESSAGE消息宏收,然后把该消息发来的数据添加到UI线程类的成员数据列表里,然后在UI线程的Run()函数里处理。结果死活收不到消息(消息的发送和接受宏等都没有任何问题,已确认)。尝试在Run()里用GetMessage收,可以收到消息!当下不解。调试了半天,发现问题出在Run函数里的CWinThread::Run();这句话。默认情况下,新建一个派生自CWinThread的线程,Run这个虚函数中只有这句话:return CWinThread::Run()只要这句话被运行,则消息立马可以收到了。但是,问题来了,这句话一倍运行,Run函数的控制权就不在我这里了,想对收到的消息进行处理就无法实现了。请问,这种情况应该怎么解决。附修改的Run函数代码:
Run()
{
while (事件列表里有事件)
{
做相应操作;
} return CWinThread::run();
}原本以为InitInstance()虚函数返回TRUE后,消息队列就已经建立了,现在这样看来是不是并非如此?还是因为我这个Run函数while循环是个阻塞型的操作,所以消息被阻塞了,完全收不到消息。如果是后者,那有什么好的做法没? 可能有人会说,既然让它运行了基类的Run函数后,可以收到消息了,直接收到消息后就处理了不就完了。的确如此,只是为了搞明白这个机制,所以有这样的疑问,纯属研究,请大家不吝指教。
Run()
{
while (事件列表里有事件)
{
做相应操作;
} return CWinThread::run();
}原本以为InitInstance()虚函数返回TRUE后,消息队列就已经建立了,现在这样看来是不是并非如此?还是因为我这个Run函数while循环是个阻塞型的操作,所以消息被阻塞了,完全收不到消息。如果是后者,那有什么好的做法没? 可能有人会说,既然让它运行了基类的Run函数后,可以收到消息了,直接收到消息后就处理了不就完了。的确如此,只是为了搞明白这个机制,所以有这样的疑问,纯属研究,请大家不吝指教。
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
现在,我的理解更倾向于:UI线程如果想收到消息,其实一样是要把控制权交给操作系统(运行CWinThread::Run()其实就是把控制权交给了操作系统,以后只能靠消息来驱动该线程继续自己的运作了,Run函数中的后续语句已经无法被执行了),让它派发消息。如果想在保持自己控制(类似Run函数中那样的阻塞型的while语句)的前提下,响应消息,无法办到。除非显式地调用GetMessage去人为的搜索消息队列操作和派发消息。 就像工作线程,其实如果这样做,一样可以收到消息。
不知道我的理解有没有问题。
{
做相应操作;
}
程序在这个循环里面的时候是不能响应消息的,要在return CWinThread::Run();之后才能响应。