对于第二个问题,抱歉那个代码已经没有了,我记不到ThreadFunction里是什么代码了,不过不管是什么。因为是直接通过类的成员函数调用这种访问方式,即ThreadFunction不是一个虚函数进而函数地址是编译时期就定好了,且pInstance是一个类对象的指针,没有通过汇集操作,编译时就被编译成直接调用那个成员函数。也就是说前面的什么发送消息、进入模式循环等都是代理对象的代码导致的,而此处没有代理对象,故执行循环的是工作者线程而并非原来的主界面线程。
而pInstance是一个CEventTestCtrl*,重点就是它是从CWnd派生来的,语义上是界面包装类。对于MFC提供的界面包装类,由于特殊的原因,其是线程相关的,不能像楼主原来那样线程间直接传递类对象的指针,故而导致“FireEvent及一些界面更新类的函数如UpdateWindow”的调用出错,实际出错的并不是这些函数,而是其内部的ASSERT_VALID( this );断言宏。对于此,我专门写了一篇文章说明原因,楼主有兴趣可以参考:
http://www.csdn.net/Develop/read_article.asp?id=26152