自己写的线程池代码有问题,请大家过来看看 本帖最后由 ATMCash4423 于 2012-02-06 17:19:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 您问的是在程序运行中还是在程序退出后?运行中线程还在,没有退出,执行完任务之后就一直WaitForSingleObject挂在那。退出后如果线程正忙(::messagebox函数未返回),则等待1000毫秒然后TerminateThread强行结束线程。其实也不用TerminateThread结束线程,进程test。exe结束之后线程就自动被系统关闭了。 怎么看啊?我操作的堆就是线程池构造函数中new的几个线程啊~析构中delete线程~~其他的没操作啊~~请您分析分析我代码中哪有问题啊? 你直接TerminateThread强制结束线程,太暴力了吧 那程序要退出,用什么办法结束线程啊?难道线程没运行完主程序就要等到它运行完吗?bool CThread::DeleteThread(void){ if (!IsBusy()) { IsExit = true; if (SetEvent(ThreadState_Event)) return true; else return false; } Sleep(1000);// if (TerminateThread(Thread_HANDLE,-1))// return true;// else return false; }我注释掉TerminateThread也不行啊,还有那个错误提示啊~看来不是强行结束线程的问题~~ 有可能是delete的问题,我注释掉CThreadpool::~CThreadpool(void){ DeleteAllThreads(); //delete [] Threads;这句也没问题了}那是否是因为NEW了之后threads的首地址改变了,导致delete时出错?问题是我断点调试了一下,new之后和delete之前threads的值是一致的啊~请各位看看我的代码中new了几个cthread类,在cthread类中哪些代码能改变堆?? 大概看了下,可能是bool CThread::DeleteThread(void)这里有问题;没有进行调试过,所以一时也不能肯定 我重新修改一下bool CThread::DeleteThread(void){ if (!IsBusy()) { IsExit = true; if (SetEvent(ThreadState_Event)) return true; else return false; } Sleep(1000); if (TerminateThread(Thread_HANDLE,-1)) return true; else return false;}……void CThread::ReleaseThread(){ CloseHandle(Thread_HANDLE); CloseHandle(ThreadState_Event); task = NULL;}……CThreadpool::~CThreadpool(void){ for (int i = 0; i < count; i++) { //Threads[i].DeleteThread();//如果此函数在前则会出现这个报错, Threads[i].ReleaseThread();//如果此函数在前则不会出现那个错误。 Threads[i].DeleteThread(); } //DeleteAllThreads(); delete [] Threads; Threads = NULL;}我隐隐约约觉得问题是因为new的对象中有内核对象event,在close内核对象和delete对象的顺序上出了问题,导致堆被破坏~~~请明白人讲讲原理啊! 忘了说,修改的内容就是把CThread类的构造函数,析构函数中的代码分别单独做成了一个函数,然后调用。 怎么按时间条件查询数据库 Active X控件显示? 对话框中的内存泄漏 紧急求救,再线等.... 怎么从后面查找一个字符串的位置 一个老问题:如何用vc和msxml读xml文件的信息? ToolBar的Bitmap问题 奇怪了,有了hBitmap,却拿不到Bitmap的长和宽。 有没有在宁波的程序员 请问关于isapi的问题 error C2440: “函数”: 无法从“GLfloat”转换为“const GLfloat *” VC++6.0 库文件的更换
其实也不用TerminateThread结束线程,进程test。exe结束之后线程就自动被系统关闭了。
我操作的堆就是线程池构造函数中new的几个线程啊~析构中delete线程~~其他的没操作啊~~请您分析分析我代码中哪有问题啊?
bool CThread::DeleteThread(void)
{
if (!IsBusy())
{
IsExit = true;
if (SetEvent(ThreadState_Event))
return true;
else
return false;
}
Sleep(1000);
// if (TerminateThread(Thread_HANDLE,-1))
// return true;
// else
return false;
}我注释掉TerminateThread也不行啊,还有那个错误提示啊~看来不是强行结束线程的问题~~
{
DeleteAllThreads();
//delete [] Threads;这句也没问题了
}那是否是因为NEW了之后threads的首地址改变了,导致delete时出错?问题是我断点调试了一下,new之后和delete之前threads的值是一致的啊~请各位看看我的代码中new了几个cthread类,在cthread类中哪些代码能改变堆??
没有进行调试过,所以一时也不能肯定
{
if (!IsBusy())
{
IsExit = true;
if (SetEvent(ThreadState_Event))
return true;
else
return false;
}
Sleep(1000);
if (TerminateThread(Thread_HANDLE,-1))
return true;
else
return false;}
……
void CThread::ReleaseThread()
{
CloseHandle(Thread_HANDLE);
CloseHandle(ThreadState_Event);
task = NULL;
}
……
CThreadpool::~CThreadpool(void)
{
for (int i = 0; i < count; i++)
{
//Threads[i].DeleteThread();//如果此函数在前则会出现这个报错,
Threads[i].ReleaseThread();//如果此函数在前则不会出现那个错误。
Threads[i].DeleteThread();
}
//DeleteAllThreads();
delete [] Threads;
Threads = NULL;
}我隐隐约约觉得问题是因为new的对象中有内核对象event,在close内核对象和delete对象的顺序上出了问题,导致堆被破坏~~~请明白人讲讲原理啊!