程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 淺析MFC多線程傳參問題

淺析MFC多線程傳參問題

編輯:C++入門知識

在一個程序中,這些獨立運行的程序片斷叫作“線程”Thread),利用它編程的概念就叫作“多線程處理”。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。MFC中使用多線程比較簡單,大家都推薦用AfxBeginThread來實現,但使用過程中確遇到傳入this之後不能得到對象內部字段數據的問題。

一、問題代碼

1.1 Test.h

  1. #pragma once  
  2. class CTest  
  3. {  
  4. public:  
  5. CTest(void);  
  6. ~CTest(void);  
  7. void ThreadMethod(HWND hWnd);  
  8. HWND m_hWnd;  
  9. };  
  10.  

1.2 Test.cpp

  1. #include "StdAfx.h"  
  2. #include "Test.h"  
  3. CTest::CTest(void)  
  4. {  
  5. }  
  6. CTest::~CTest(void)  
  7. {  
  8. }  
  9. UINT ThreadProc(LPVOID lpParam)  
  10. {  
  11. CTest* test = (CTest*)lpParam;  
  12. HWND hWnd = test->m_hWnd;  
  13. return 0;  
  14. }  
  15. void CTest::ThreadMethod(HWND hWnd)  
  16. {  
  17. this->m_hWnd = hWnd;  
  18. AfxBeginThread(ThreadProc,this);  
  19. }  

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在頭文件裡面聲明即可,再次斷點發現數據正常。

問題比較隱蔽,因為之前就是使用指針方式調用,後來改成對象調用才出的問題,所以猜出來的,目前原理還不太明白。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved