前言
MFC中使用多线程比较简单,大家都推荐用AfxBeginThread来实现,但使用过程中确遇到传入this之后不能得到对象内部字段数据的问题。
正文
一、问题代码
1.1 Test.h
#pragma
once
class CTest
{
public :
CTest( void );
~ CTest( void );
void ThreadMethod(HWND hWnd);
HWND m_hWnd;
};
class 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 );
}
#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);
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 -> ThreadMethod(m_hWnd);
test在头文件里面声明即可,再次断点发现数据正常。
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/583024,如需转载请自行联系原作者