前言

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

  三、测试代码下载

    /Files/over140/2010/5/AfxThreadLesson.rar

结束语

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

[MFC]多线程传参问题 [AfxBeginThread]相关推荐

  1. python爬虫02-提升爬取效率、多线程,多线程传参,多进程,线程及线程池概念,协程,多任务异步协程,异步请求aiohttp模块,视频站工作原理

    1.提升爬取效率 使用多线程,多进程,携程,异步 2.多线程 进程是资源单位,每个进程,都会有一个默认的主线程 线程是执行单位 执行多线程需要导包: from threading import Thr ...

  2. c++11 多线程传参和生产者消费者实现

    普通函数传参和成员函数传参 #include <iostream> #include <thread> #include <windows.h> void func ...

  3. python3多线程传参_python多线程 怎么传送多个参数

    对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效.我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据,同时它还要保证在管理用户线程时保证 ...

  4. 易语言多线程时钟多线程数组传参

    传参-时钟多线程-数组传参 1.时钟组件 2.数组传参 3.多线程传参 教程源码: .版本 2 .支持库 EThread .支持库 spec.局部变量 n, 整数型n = 取数组成员数 (A_str) ...

  5. Python爬虫笔记——多线程(threading)传参

    参考文章: Python多线程3 多线程的传参与返回值 BBJG_001的博客--多线程 threading库知识点补充 学习网站: 莫烦Python 学习别人的经验: 在主线程用一个变量或者直接输出 ...

  6. Qt多线程使用 和 信号与槽传参 需要注意的问题

    Qt中提供了线程类,默认窗口是主线程,这个时候如果我们的业务逻辑很费时,就会一直使用主线程,页面可能会卡顿甚至崩溃.那么将业务逻辑放入子线程,能够避免页面的卡顿,保证操作是流畅的,还能提高程序的执行效 ...

  7. C++11多线程第三篇:线程传参详解,detach()大坑,成员函数做线程参数

    文章目录 3.1 传递临时对象作为线程参数 3.1.1 要避免的陷阱(解释1) 3.1.2 要避免的陷阱(解释2) 3.1.3 总结 3.2 临时对象作为线程参数进一步详解 3.2.1 线程id概念 ...

  8. java多线程run方法传参

    我们知道多线程是通过star()方法让线程处于准备就绪状态,而实际运行的业务逻辑是放在run()方法体中的,但是run()方法是没有参数的方法,实际的业务场景中,我们可能需要向方法体中传递参数,下面介 ...

  9. 任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet

    任务(多线程并行)TFDMemTable内存表传参方式调用服务器返回的TDataSet 服务器端: function TServerMethods1.getTFDDataSet   ( const p ...

最新文章

  1. sa执行命令方法总结
  2. C宏定义中## 和# 的含义
  3. Deep Learning in a Nutshell: Core Concepts
  4. 华为手机拍照后图库里无照片_EMUI的相册不这么用,还用什么智能手机?
  5. 特斯拉2020年第三季度共生产14.5万辆汽车 交付约14万辆
  6. Windows 下使用ftp批处理脚本
  7. linux下mongodb 安装,linux下mongodb安装
  8. freebsd mysql utf8_FreeBSD环境下Mysql问题解决方法集锦
  9. 【优化调度】基于matlab多目标粒子群算法求解风电光伏储能电网发电与需求响应调度优化问题【含Matlab源码 239期】
  10. yii操作数据库(AR)
  11. H265解码流程理解
  12. 由于找不到MSVCR100.dll,无法继续执行代码解决方法
  13. 12306 抢票系列之只要搞定RAIL_DEVICEID的来源,从此抢票不再掉线(中)
  14. 某乎x-zse-96、x-zst-81最新通杀方案
  15. FastQC的安装与使用
  16. 如何书写md格式的文档
  17. base64真正的作用和意义
  18. OB38R08T1读24C64程序
  19. linux 分卷压缩命令
  20. 华为C语言面试题(转!)

热门文章

  1. 实例解说.Net构架下的加密编程
  2. AES(Advanced Encryption Standard) Intrinsics各函数介绍
  3. OpenCV中响应鼠标信息cvSetMouseCallback函数的使用
  4. 【Go】Go基础(十):文件读写
  5. mysql怎么判断2个时间戳为同一天_请教一个需求js怎么判断时间戳是否属于同一天...
  6. linux 物理内存用完了_Linux用户空间与内核空间(理解高端内存)
  7. 1亿以内素数的个数_ghpython_素数
  8. ios alertview 链接_iOS-MobLink集成流程
  9. Java项目:日历万年历(java+swing)
  10. mysql删除原则_MySQL数据库的增删选查