给工作线程传递类指针,工作线程调用类成员函数后,访问类成员变量的问题

DDGG 2008-06-05 10:23:51
写了一个简单的类,使用了多线程。为了能在线程中调用类成员函数,传递了类的this指针给线程,但是在新线程运行的成员函数中。。

HiddenConsole.h
// HiddenConsole.h: interface for the CHiddenConsole class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_)
#define AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <afxmt.h>

class CHiddenConsole
{
public:
CHiddenConsole();
virtual ~CHiddenConsole();
void Start();
BOOL _StartConsole();
protected:
HANDLE m_hConsoleIptRead;
HANDLE m_hConsoleIptWrite;
HANDLE m_hConsoleOptRead;
HANDLE m_hConsoleOptWrite;
CEvent m_eventBreak;
};

BOOL CreateConsolePipe(PHANDLE p_hRead, PHANDLE p_hWrite);
BOOL StartConsole();
UINT ThreadStartConsole(LPVOID lpParam);

#endif // !defined(AFX_HIDDENCONSOLE_H__09908658_E7ED_4BAB_BF7A_8CC31FAEED10__INCLUDED_)



HiddenConsole.cpp
/ HiddenConsole.cpp: implementation of the CHiddenConsole class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HiddenConsole.h"

#include <string>
using namespace std;

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHiddenConsole::CHiddenConsole()
{
CreateConsolePipe(&m_hConsoleIptRead, &m_hConsoleIptWrite);
CreateConsolePipe(&m_hConsoleOptRead, &m_hConsoleOptWrite);
// 在这里设断点,记录这几个成员变量的值。
}

CHiddenConsole::~CHiddenConsole()
{
m_eventBreak.SetEvent();
CloseHandle(m_hConsoleIptRead);
CloseHandle(m_hConsoleOptRead);
CloseHandle(m_hConsoleIptWrite);
CloseHandle(m_hConsoleOptWrite);
}

void CHiddenConsole::Start()
{
AfxBeginThread(ThreadStartConsole, this);
}

UINT ThreadStartConsole(LPVOID lpParam)
{
CHiddenConsole *p_hiddenConsole = (CHiddenConsole *)lpParam;
p_hiddenConsole->_StartConsole();

return 0;
}

BOOL CHiddenConsole::_StartConsole()
{
string strSysDir;
string strAppPathName;
string strParam;

strSysDir.resize(255);
GetSystemDirectory((char *)strSysDir.data(), strSysDir.size());
strSysDir.resize(strlen(strSysDir.c_str()));

strAppPathName = strSysDir + "\\diskpart.exe";
return LaunchAndWait(strAppPathName.c_str(), (LPSTR)strParam.c_str(), SW_HIDE,
m_hConsoleIptRead, m_hConsoleOptWrite, m_hConsoleOptWrite, m_eventBreak.m_hObject); // 在这里设断点,发现这几个成员变量的值都不对了,导致后面的操作得到错误结果。请问这是怎么一回事?在新的线程中,通过类指针还是不能访问类的所有成员变量吗?
}

BOOL CreateConsolePipe(PHANDLE p_hRead, PHANDLE p_hWrite)
{
SECURITY_ATTRIBUTES saSecurityAttributes;
CString cstrMsg;
BOOL bResult = TRUE;

saSecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
saSecurityAttributes.lpSecurityDescriptor = NULL;
saSecurityAttributes.bInheritHandle = TRUE;
return CreatePipe(p_hRead, p_hWrite, &saSecurityAttributes, 0);
}


谢谢!
...全文
161 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DDGG 2008-06-05
  • 打赏
  • 举报
回复
是的,你说得很对,我以前就是把对象定义成局部变量,结果在函数退出的时候对象就释放了。
定义成对话框类的成员变量就行了,关闭对话框退出程序的时候,才结束CHiddenConsole对象的生命期。
Tolirry 2008-06-05
  • 打赏
  • 举报
回复
CHiddenConsole的成员变量首先初始化,然后Start启动线程,并且确保启动线程后,CHiddenConsole的成员变量没有被改变,并且,用CHiddenConsole定义的变量不应该有生命器,例如,某个函数中定义

void fun(void)
{
CHiddenConsole chc;
chc.initialize(); // 初始化变量
chc.start(); // 启动线程
}

这样,当fun返回时候,chc就析构了,所以之后的线程中的chc成员句柄值就不确定了。

应该在线程启动以及结束后,保证CHiddenConsole变量不能被释放。

可以这样
CXXWinApp::CXXWinApp()
{
CHiddenConsole m_pChc = new CHiddenConsole;
}

CXXWinApp::~CXXWinApp()
{
if (m_pChc != NULL)
{
delete m_pChc;
m_pChc = NULL;
}
}

就可以保证m_pChc的生命期同该进程的生命期相同。
DDGG 2008-06-05
  • 打赏
  • 举报
回复
我好像用类定义了一个局部变量
DDGG 2008-06-05
  • 打赏
  • 举报
回复
啊啊啊,貌似有这个可能。。。
DDGG 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangk 的回复:]
CHiddenConsole的对象已经超出生存期了?还是被delete掉了?
[/Quote]

都没有,还在CHiddenConsole::_StartConsole()里啊,怎么会没了呢。
wangk 2008-06-05
  • 打赏
  • 举报
回复
CHiddenConsole的对象已经超出生存期了?还是被delete掉了?

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧