浅析MFC多线程传参问题

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。MFC中使用多线程比较简单,大家都推荐用AfxBeginThread来实现,但使用过程中确遇到传入this之后不能得到对象内部字段数据的问题。

10年积累的成都做网站、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站设计后付款的网站建设流程,更有贵港免费网站建设让你可以放心的选择与我们合作。

一、问题代码

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. };

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

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

新闻名称:浅析MFC多线程传参问题
URL地址:http://www.gawzjz.com/qtweb/news15/176815.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联