关于结束线程的问题,各位老大请帮忙指点,多谢了
时间:2011-12-11
来源:互联网
各位老大好,小弟求助个问题,是这样的:
我有一个MFC程序,里面用到了一个函数,是耗时返回的,为了不让程序在函数执行中卡死,我就创建了一个线程,把那个耗时的函数放到了线程回调里执行。
可是,我有一个要求,那就是,我必须能在主线程里随时可以终止我创建的这个线程的执行。
这样问题就来了,我看到好多代码和教程里都介绍用事件返回来判断,从而终止线程,可是,我这个不行,因为上面说了,线程回调函数在执行到我那个耗时函数的时候是卡死状态的。
所以,我如果要在线程外终止它的话,就只能强制结束,看小弟下面的代码:
CWinThread* pT=NULL; //线程指针
pT=AfxBeginThread(ThreadProc,NULL,NULL,0,CREATE_SUSPENDED,NULL); //创建线程
pT->m_bAutoDelete=FALSE;
pT->ResumeThread();
//结束线程
if(pT!=NULL)
{
DWORD dwexitcode;
GetExitCodeThread(pT->m_hThread,&dwexitcode);
TerminateThread(pT->m_hThread,dwexitcode);
WaitForSingleObject(pT->m_hThread,INFINITE);
CloseHandle(pT->m_hThread);
delete pT;
pT=NULL;
}
这样似乎可以做到,不过这样似乎不是办法,而且更要命的是,调用几次TerminateThread之后,程序就彻底锁死了。这个我应该如何做呢?
说了这么一大堆,这不请求各位老大帮忙来了,小弟不胜感激啊!
我有一个MFC程序,里面用到了一个函数,是耗时返回的,为了不让程序在函数执行中卡死,我就创建了一个线程,把那个耗时的函数放到了线程回调里执行。
可是,我有一个要求,那就是,我必须能在主线程里随时可以终止我创建的这个线程的执行。
这样问题就来了,我看到好多代码和教程里都介绍用事件返回来判断,从而终止线程,可是,我这个不行,因为上面说了,线程回调函数在执行到我那个耗时函数的时候是卡死状态的。
所以,我如果要在线程外终止它的话,就只能强制结束,看小弟下面的代码:
CWinThread* pT=NULL; //线程指针
pT=AfxBeginThread(ThreadProc,NULL,NULL,0,CREATE_SUSPENDED,NULL); //创建线程
pT->m_bAutoDelete=FALSE;
pT->ResumeThread();
//结束线程
if(pT!=NULL)
{
DWORD dwexitcode;
GetExitCodeThread(pT->m_hThread,&dwexitcode);
TerminateThread(pT->m_hThread,dwexitcode);
WaitForSingleObject(pT->m_hThread,INFINITE);
CloseHandle(pT->m_hThread);
delete pT;
pT=NULL;
}
这样似乎可以做到,不过这样似乎不是办法,而且更要命的是,调用几次TerminateThread之后,程序就彻底锁死了。这个我应该如何做呢?
说了这么一大堆,这不请求各位老大帮忙来了,小弟不胜感激啊!
作者: xiaokan168 发布时间: 2011-12-11
你别老terminate啊,让线程主动退出啊。
作者: jennyvenus 发布时间: 2011-12-11
线程自动退出必须要执行完才可以return,而我这个线程,必须想终止的时候就终止,不等待,有办法吗
作者: xiaokan168 发布时间: 2011-12-11
你那个耗时函数得重写,减少一次操作的时间。
或者你可以把耗时操作放到一个服务进程里去。
或者你可以把耗时操作放到一个服务进程里去。
作者: jiangsheng 发布时间: 2011-12-11
耗时函数是别人接口里的,不能重写。
关于后者,能详细说说吗,谢谢。
关于后者,能详细说说吗,谢谢。
引用 3 楼 jiangsheng 的回复:
你那个耗时函数得重写,减少一次操作的时间。
或者你可以把耗时操作放到一个服务进程里去。
你那个耗时函数得重写,减少一次操作的时间。
或者你可以把耗时操作放到一个服务进程里去。
作者: xiaokan168 发布时间: 2011-12-11
‘你那个耗时函数得重写,减少一次操作的时间’如:
switch(step)
{
case 1:
do1ststep();
step=2;
case 2:
do2ndstep();
step=3;
case 3:
。。。
switch(step)
{
case 1:
do1ststep();
step=2;
case 2:
do2ndstep();
step=3;
case 3:
。。。
作者: schlafenhamster 发布时间: 2011-12-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28