关于线程的问题 大家好。我想请教大家一个多线程的问题:我自己定义了一个绘图类。并在该类中启动一个线程。这个线程我是在类的构造函数中创建的。再debug模式下编译通过没有问题,运行也正常。但是在退出程序的时候程序会报错。请问高手们这是怎么回事 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先是问题描述得太含糊了。其次,在工作线程中处理绘图本就有问题。因为大多数MFC类都用到了线程局部存储(TLS)的map。 DWORD CALLBACK DrawWaveThread(PVOID pParma)//线程函数{ CDrawWaveClass *p = (CDrawWaveClass*)pParma; //CDrawWaveClass为我自己定义的绘图类 while(!p->m_Terminated) { WaitforsingnalEvent(.....); p->DrawWave(p->GetDC()) ; //DrawWave为CDrawWaveClass中的公共成员函数 p->ReleaseDC(); }}CDrawWaveClass::CDrawWaveClass()//构造函数{ ... ... m_hThreadEvent = CreateEvent(...);//创建信标 m_hThread = CreateThread(NULL,0,DrawWaveThread,this,0,NULL);//创建线程}CDrawWaveClass::~CDrawWaveClass()//析构函数{ m_Terminated = TRUE; if(m_hThreadEvent) SetEvent(CDrawWaveClass); Sleep(50); if(hThread) { CloseHandle(hThread); hThread = NULL; }} 然后在对主话框中定义一个CDrawWaveClass对象,这样CDrawWaveClass在实例化的时候就完成了创建线程。并启动线程的工作。这样的话在Debug模式下编译能够通过。并且运行也正常。但是在关闭程序的时候,也就是程序窗口已经销毁(消失)之后。他会弹出一个“程序错误”对话框。 一个可伸缩性编码问题 VC++要学习好堆栈、链表、文件处理(读写、字符处理) OCX控键调用DLL,DLL发送消息给OCX,OCX如何调用? 有没有简单的算法,处理这样的字符串? 如何使子窗口最大化时,只填充父窗体右边的部分,就像vc那样? 怎么在一个单文档里插入一个树型控件 知道一个窗口的句柄,如何获取这个窗口的this指针 如果函数返回一个字符串指针,那么他真正的字符串是放在哪里的? 如何使用MessageBox?急用,谢谢! 帮点忙 2005的最后一天散分200,迎接2006的到来 如何把一个结构体作为全局变量??
其次,在工作线程中处理绘图本就有问题。因为大多数MFC类都用到了线程局部存储(TLS)的map。
{
CDrawWaveClass *p = (CDrawWaveClass*)pParma; //CDrawWaveClass为我自己定义的绘图类
while(!p->m_Terminated)
{
WaitforsingnalEvent(.....);
p->DrawWave(p->GetDC()) ; //DrawWave为CDrawWaveClass中的公共成员函数
p->ReleaseDC();
}
}
CDrawWaveClass::CDrawWaveClass()//构造函数
{
...
...
m_hThreadEvent = CreateEvent(...);//创建信标
m_hThread = CreateThread(NULL,0,DrawWaveThread,this,0,NULL);//创建线程
}
CDrawWaveClass::~CDrawWaveClass()//析构函数
{
m_Terminated = TRUE;
if(m_hThreadEvent)
SetEvent(CDrawWaveClass);
Sleep(50);
if(hThread)
{
CloseHandle(hThread);
hThread = NULL;
}
}
然后在对主话框中定义一个CDrawWaveClass对象,这样CDrawWaveClass在实例化的时候就完成了创建线程。并启动线程的工作。这样的话在Debug模式下编译能够通过。并且运行也正常。但是在关闭程序的时候,也就是程序窗口已经销毁(消失)之后。他会弹出一个“程序错误”对话框。