新建了一个C++类,然后开启了一个线程,发现在线程中通过类的指针访问某些类的成员变量时会出现错误,int之类的没问题,但访问CArray等会出新错误,而在普通的成员函数中访问却没问题,而且编译时连警告也没有。
访问CArray提示的信息如下:0x0005123a 处未处理的异常: 0xC0000005: 读取位置 0x0005123a 时发生访问冲突。
开始怀疑开启线程的方式不合理,AfxBeginThread和CreateThread都试了,都提示相同的错误。
这是什么原因?哪位给讲一下,先谢过!!!!
访问CArray提示的信息如下:0x0005123a 处未处理的异常: 0xC0000005: 读取位置 0x0005123a 时发生访问冲突。
开始怀疑开启线程的方式不合理,AfxBeginThread和CreateThread都试了,都提示相同的错误。
这是什么原因?哪位给讲一下,先谢过!!!!
//头文件
#pragma once
#include <afxtempl.h>
#include <afxmt.h>struct ClientInf
{
SOCKADDR_IN Addr; //客户端地址
CTime LastBeat; //上次心跳时间
};class CTest
{
public:
CTest(void);
~CTest(void);
public:
int ServerPort;
CWinThread * m_thRecv; //接收线程
CArray<ClientInf,ClientInf> m_ClientIfo;//登陆的客户端信息
public:
BOOL Start(); //开启
static UINT _DataRecv(LPVOID lparam);//接收线程
};
//源文件
#include "StdAfx.h"
#include "Test.h"
DWORD WINAPI _DataRecEx(LPVOID lparam);
CTest::CTest(void)
{
}CTest::~CTest(void)
{
}BOOL CTest::Start()
{
ClientInf NewClient;
ServerPort=3;
m_ClientIfo.Add(NewClient); //没问题
//m_thRecv=AfxBeginThread(_DataRecv,(LPVOID)this);
CreateThread(NULL,0,_DataRecEx,(LPVOID)this,0,NULL);
return TRUE;
}
//接收线程
UINT CTest::_DataRecv(LPVOID lparam)
{
CTest *pthis=(CTest*)lparam;
ClientInf NewClient;
pthis->m_ClientIfo.Add(NewClient); //报错
return 0;
}
DWORD WINAPI _DataRecEx(LPVOID lparam)
{
CTest *pthis=(CTest*)lparam;
pthis->ServerPort=3;
ClientInf NewClient;
pthis->m_ClientIfo.Add(NewClient); //报错
return 0;
}
使用的部分:
CTest test;
test.Start();感觉也不应该有问题,但就是提示错误
test 就销毁了。
所以 pThis 就没有意义了。