代码很少,就贴上来,大家可以做测试:
//iocard.h
class InterruptFace
{
public:
virtual int GetVal()=0;
};class CIOCard : public InterruptFace
{
public:
CIOCard(){};
virtual ~CIOCard(){};
virtual int GetVal(){return 10;}
};class CCeInterrupt
{
public:
static CCeInterrupt* Instance();
static void Release();
static CCeInterrupt* _instance; void RegFace(InterruptFace* owner){_owner = owner;};
void Run();
InterruptFace* _owner;
protected:
CCeInterrupt(){}
~CCeInterrupt(){}
};//iocard.cpp
DWORD WINAPI ThreadProcIST(PVOID pParam);
CCeInterrupt* CCeInterrupt::_instance = NULL;
CCeInterrupt* CCeInterrupt::Instance()
{
if(!_instance)
_instance = new CCeInterrupt();
return _instance;
}
void CCeInterrupt::Release()
{
}
void CCeInterrupt::Run()
{
HANDLE _hThread;
DWORD dwThreadID;
_hThread = CreateThread(NULL, 0,
ThreadProcIST, // 线程
this, // 参数
CREATE_SUSPENDED,// 创建挂起的线程
&dwThreadID // 线程 ID
);
ResumeThread( _hThread );
}DWORD WINAPI ThreadProcIST(PVOID pParam)
{
CCeInterrupt* prun = (CCeInterrupt*)pParam;
int val = prun->_owner->GetVal(); //??? 调试报异常
int aa = val;
//TRACE("%d", val);
return 1;
}//mydlg.cpp
BOOL CMyDlg::OnInitDialog()
{
...
CIOCard card; CCeInterrupt* run = CCeInterrupt::Instance();
run->RegFace(&card);
run->Run();
}代码的意思是:
1.写了个接口: InterruptFace
2.一个非常简单的类 CIOCard继承这个接口
3.一个很简单的类CCeInterrupt,接收CIOCard的注册,然后启动一个线程.4.问题在这个线程. 线程参数是CCeInterrupt*类型, 通过它可以访问CIOCard改写的接口函数. 但是, 访问失败:"Unhandled exception in MyDlg.exe : 0xC0000005 access violation".当然,这个异常还不算最为怪异. 如果,你用一个Console工程,或者在上面的
OninitionDialog()
{
..
run->Run();
Sleep(1000*60*3);
}
将不出现这个问题. 这是为什么呢? 高手来看看.
//iocard.h
class InterruptFace
{
public:
virtual int GetVal()=0;
};class CIOCard : public InterruptFace
{
public:
CIOCard(){};
virtual ~CIOCard(){};
virtual int GetVal(){return 10;}
};class CCeInterrupt
{
public:
static CCeInterrupt* Instance();
static void Release();
static CCeInterrupt* _instance; void RegFace(InterruptFace* owner){_owner = owner;};
void Run();
InterruptFace* _owner;
protected:
CCeInterrupt(){}
~CCeInterrupt(){}
};//iocard.cpp
DWORD WINAPI ThreadProcIST(PVOID pParam);
CCeInterrupt* CCeInterrupt::_instance = NULL;
CCeInterrupt* CCeInterrupt::Instance()
{
if(!_instance)
_instance = new CCeInterrupt();
return _instance;
}
void CCeInterrupt::Release()
{
}
void CCeInterrupt::Run()
{
HANDLE _hThread;
DWORD dwThreadID;
_hThread = CreateThread(NULL, 0,
ThreadProcIST, // 线程
this, // 参数
CREATE_SUSPENDED,// 创建挂起的线程
&dwThreadID // 线程 ID
);
ResumeThread( _hThread );
}DWORD WINAPI ThreadProcIST(PVOID pParam)
{
CCeInterrupt* prun = (CCeInterrupt*)pParam;
int val = prun->_owner->GetVal(); //??? 调试报异常
int aa = val;
//TRACE("%d", val);
return 1;
}//mydlg.cpp
BOOL CMyDlg::OnInitDialog()
{
...
CIOCard card; CCeInterrupt* run = CCeInterrupt::Instance();
run->RegFace(&card);
run->Run();
}代码的意思是:
1.写了个接口: InterruptFace
2.一个非常简单的类 CIOCard继承这个接口
3.一个很简单的类CCeInterrupt,接收CIOCard的注册,然后启动一个线程.4.问题在这个线程. 线程参数是CCeInterrupt*类型, 通过它可以访问CIOCard改写的接口函数. 但是, 访问失败:"Unhandled exception in MyDlg.exe : 0xC0000005 access violation".当然,这个异常还不算最为怪异. 如果,你用一个Console工程,或者在上面的
OninitionDialog()
{
..
run->Run();
Sleep(1000*60*3);
}
将不出现这个问题. 这是为什么呢? 高手来看看.
解决方案 »
- mschart柱状图,如何在x轴上显示ColumnLabel,同时改变颜色
- InstallShield 10.5 的一点郁闷问题
- 请教一个matlab调用vc编译的dll的问题
- 怎样将文件夹图标文件(folder.ico),导入到工程中,并设置ID 为 IDI_FOLDER??
- 关于DirectX 9 SDK的配置
- 关于引用第三方Dll的问题!!!!
- 怎样给edit控件赋值,我使用SetWindowText为什么不好用?
- 怎样让CStatic 对象显示图表 ?
- 我用VC编译出来的程序(Debug)在本机和其他机子上运行结果略有差别,不知道为什么,各位有没有碰到过
- 请告诉我qq服务器的ip,就是sz.tencent.com的ip
- VC6 调用 ActiveX 的问题
- 请问有这样的软件吗(偷偷复制)
建议将card声明为全局变量或则阻塞Run函数知道线程结束。
{
CCeInterrupt* prun = (CCeInterrupt*)pParam
int val = prun->_owner->GetVal(); //异常在这里. _owner定义: InterruptFace* _owner;
...
}
跟踪过"prun->_owner"的值为0x0012f64c,与 RegFace()值相同.
但用prun访问CCeInterrupt中的其他数据,这个做过多次测试,没有任何问题.