以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  多线程传参  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=89098)


--  作者:葛靖青001
--  发布时间:1/11/2011 4:11:00 PM

--  多线程传参
【转自互联网】

前言

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

  结束语

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



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
35.156ms