前言
MFC中使用多线程比较简单,大家都推荐用AfxBeginThread来实现,但使用过程中确遇到传入this之后不能得到对象内部字段数据的问题。
正文
一、问题代码
1.1Test.h
#pragma onceclass CTest{public:CTest(void);~CTest(void);void ThreadMethod(HWND hWnd);HWND m_hWnd;}; |
1.2 Test.cpp
#include "StdAfx.h"#include "Test.h"CTest::CTest(void){}CTest::~CTest(void){}UINT ThreadProc(LPVOID lpParam){CTest* test = (CTest*)lpParam;HWND hWnd = test->m_hWnd;return 0;}void CTest::ThreadMethod(HWND hWnd){this->m_hWnd = hWnd;AfxBeginThread(ThreadProc,this);} |
1.3 MFC主窗体方法调用
CTest test;test.ThreadMethod(m_hWnd); |
1.4 调试和说明
将断点打到ThreadProc方法的“HWND hWnd = test->m_hWnd;”,执行发现是空的,而在CTest::ThreadMethod处明明赋值了!实际中还发现变量类型是int可以传递,CString传之后是乱码或非原始数据了。
二、解决办法
将test声明为一个指针,通过指针来调用方法,如下:
test = new CTest();test->ThreadMethod(m_hWnd); |
test在头文件里面声明即可,再次断点发现数据正常。
结束语
问题比较隐蔽,因为之前是使用指针方式调用,后来改成对象调用才出的问题,所以猜出来的,目前原理还不太明白。