[MFC]多线程传参问题 [AfxBeginThread]

前言

  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

 

结束语

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

转载:http://www.cnblogs.com/over140/archive/2010/05/24/1742476.html

时间: 2024-12-31 02:27:31

[MFC]多线程传参问题 [AfxBeginThread]的相关文章

python-Python多线程问题,target以及kwargs传参出错,请问应该怎么写

问题描述 Python多线程问题,target以及kwargs传参出错,请问应该怎么写 def A(a,b,c): 代码块省略 def B(a,b,c,d): 代码块省略 def thread(self,arg*): t1 = threading.Thread(target=A,args=(a,b,c)) 问题一:这里我想参数target=需要多开线程的方法名,然后我随便定义一个变量作为方法名参数传到target里面,,不行,,程序报错.求正确的传参方法,难不成我要为每一个要多开的方法都要多写一

C++ 关于MFC多线程编程的注意事项

  这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下 在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread 来创建一个工作线程,看一下这个函数的说明: 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize =

C++ 关于MFC多线程编程的注意事项_C 语言

在多线程编程中,最简单的方法,无非就是利用 AfxBeginThread  来创建一个工作线程,看一下这个函数的说明: 复制代码 代码如下: CWinThread* AFXAPI AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_AT

vs2012 opengl-Opengl MFC多线程如何在原窗口进行绘图

问题描述 Opengl MFC多线程如何在原窗口进行绘图 由于OPENGL绘图占用时间较长(32ms),不得不新开一个线程进行绘图,但我发现我现在的程序每次都要新建窗口.请问,怎么在原窗口上绘图啊? 解决方案 glutCreateWindow()从名字上看不是你注释的设置窗口标题,而是创建一个新窗口. 看你线程中的代码应该是从一个控制台项目中拷贝过来的,因为没用过opengl所以不能给你明确的解决办法,但估计opengl应该有个设置绘图窗口的函数,你在线程中调用这个函数就可以了. 建议还是仔细看

js中window.showModalDialog各浏览器居中和传参实例兼以及一些兼容性问题

  浏览器居中以及传参实例 window.showModelDialog可设置center参数为yes,保证其在子窗口在父窗口居中. 但是该参数只对IE浏览器有效,对火狐无效,只有通过计算模态窗口的居中位置.   解决办法 function openShowModalDialog(url,param,whparam,e){    // 传递至子窗口的参数  var paramObj = param || { };    // 模态窗口高度和宽度  var whparamObj = whparam

图片-jsp页面传参问题(参数长度太长)

问题描述 jsp页面传参问题(参数长度太长) < img src=""../admin/image-read.action?icode=${data.icode}""/> 其中icode是一个图片的二进制数据串,比较长,传不到后台.有什么其他方法? 解决方案 这个方式肯定不行啊,虽然没明白你是不是直接从前台获取一个本地图片然后在jsp中转成二进制的,但是这样肯定传不了的.可以使用ajax form提交提交后也不刷新当前页面. 解决方案二: jsp页面传到

Javascript实例教程:点击传参方法和鼠标事件方法

文章简介:从这张开始就和大家说一些实用的效果的写法.当然首当其冲的就是我们可爱的TAB选项卡,用JQ写选项卡当然是很方便的而且方法也很多.其实用原生的JS写选项卡方法也很多. 从这张开始就和大家说一些实用的效果的写法.当然首当其冲的就是我们可爱的TAB选项卡,用JQ写选项卡当然是很方便的而且方法也很多.其实用原生的JS写选项卡方法也很多.下面我就写几个给大家看看一,点击传参方法<script>function tab(dom){var list = document.getElementByI

jsp页面传参乱码的解决方法

 本篇文章主要是对jsp页面传参乱码的解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 jsp页面传参乱码的解决方法   jsp页面js:   encodeURIComponent要使用两次 encodeURIComponent(encodeURIComponent(userAccount));   java: String  userAccount = java.net.URLDecoder.decode(userAccount,"UTF-8");/*需要处理异常*/

jsp中文页面乱码与传参乱码

  页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可 代码如下   <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="err.jsp" %> 数据库乱码 这种乱码会使你插入数据库的中文变成乱码,或者读出显