最近需要使用MFC显示Kinect获取的数据。为了防止Kinect数据处理耗时太久,另外开辟了一个进程进行数据读取和处理工作。在数据处理完毕后,需要调用显示结果的函数。依照以前的做法,直接将对话框类的指针传入到子进程函数中,然后调用结果显示的函数进行显示。
但是,运行时总是报出Assert错误,说出错地方是wincore.cpp的888行和889行错误。通过调试,发现错误指向UpdateData函数。然后通过搜索,发现原来是跨线程调用MFC窗口对象的问题。在子线程中调用界面线程的窗口对象,会产生不可预料的结果。那么,只有将结果传递给界面线程,并使用消息传递的方式来实现子线程更新界面线程的窗口对象。
在MFC中,自定义消息及响应函数的方法为:
1. 在.h文件中自定义消息,需从WM_USER开始,如#define WM_UPDATEDATA (WM_USER+100)
2. 在.cpp文件的MESSAGE_MAP中添加消息和响应函数的连接,如:ON_MESSAGE(WM_UPDATEDATA, &CSystemDlg::OnUpdatedata)
3. 在.h文件和.cpp文件中分别声明和定义消息响应函数。
上述三个步骤可以手动添加,也可以借助VS的工具添加,更加方便。VS的Class wizard工具可以自动完成上述三个步骤中第2步和第3步的手工工作,更加便捷。
1. 打开Project->Class Wizard,或者右击项目,打开Class Wizard。
2. 选择Message选项,对话框下面有个“Add Custom Message”,点击打开,如下图所示:
3. 填写已经自定义的消息,以及对应的响应函数,系统自动产生两个步骤的代码,如下图所示: