在一個程序中,這些獨立運行的程序片斷叫作“線程”Thread),利用它編程的概念就叫作“多線程處理”。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。MFC中使用多線程比較簡單,大家都推薦用AfxBeginThread來實現,但使用過程中確遇到傳入this之後不能得到對象內部字段數據的問題。
一、問題代碼
1.1 Test.h
- #pragma once
- 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);
- }
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在頭文件裡面聲明即可,再次斷點發現數據正常。
問題比較隱蔽,因為之前就是使用指針方式調用,後來改成對象調用才出的問題,所以猜出來的,目前原理還不太明白。