MFC多线程传参问题

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  前言

  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在头文件里面声明即可,再次断点发现数据正常。

  结束语

  问题比较隐蔽,因为之前就是使用指针方式调用,后来改成对象调用才出的问题,所以猜出来的,目前原理还不太明白。

  编辑特别推荐:

  Win32编程:SetTimer的使用

  VC++实现应用程序对插件的支持

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答