如何立即结束一个正在工作的线程?

vcmfcjavabbs 2009-08-26 06:07:01
已知不建议用termiate方法结束一个线程,结束线程最了的办法是让线程自然返回,即线程函数中安排return语句。但是有时,我们要立即结束一个线程,请问用什么方法?是不是要一个全局变量bStop,在线程函数 中每一条语句前都要if(bStop == true),这样做好像不好,请问高手有什么好的方法一?
...全文
173 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzhiwang888 2009-08-27
  • 打赏
  • 举报
回复
学习了。terminatethread它有时也不好用啊
用户 昵称 2009-08-27
  • 打赏
  • 举报
回复
TerminateThread
zhengq06 2009-08-27
  • 打赏
  • 举报
回复
学习
wish_cn 2009-08-27
  • 打赏
  • 举报
回复
最后别忘了CloseHandle。
wish_cn 2009-08-27
  • 打赏
  • 举报
回复
一般是将设置退出标志位后用WaitForSingleObject等待,并且线程函数应该保证等待可以在有限时间内完成。
  • 打赏
  • 举报
回复
对 terminatethread
lygfqy 2009-08-27
  • 打赏
  • 举报
回复
一般的情况还是在循环里做判断的
直接退出不是好办法
scguest 2009-08-27
  • 打赏
  • 举报
回复
用标志最好,如果在中途突然退出,除非你确认资源释放完,否则会导致内存泄露。
bingo0717 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 heksn 的回复:]
while(bRun)


结束
bRun = FALSE;
[/Quote]

agree
Sou2012 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jennyvenus 的回复:]
TerminateThread

[/Quote]

UP!!
reneeland 2009-08-27
  • 打赏
  • 举报
回复
最安全的办法是线程的循环体里面检查一个退出事件,此事件一触发就自己清除资源并return。
要通知此线程退出的模块就PostThreadMessage函数,将退出事件post给该线程。

hEventFinish = CreateEvent(NULL,TRUE,FALSE,NULL);//创建手工重置的Event对象

DWORD WINAPI DisplayData(LPVOID param)
{
while(TRUE)
{
if( WaitForSingleObject(pDlg->hEventFinish,0) == WAIT_OBJECT_0)
return 0; //让线程函数正常返回


//...DisplayData


}
return 0;
}



或者采用全局变量:
bool bExit;

void CTestView::OnButton7() //执行
{
DWORD dwThreadID;

bExit = false;

FThread=CreateThread(NULL,0,DisplayData,
(LPVOID )&x,CREATE_SUSPENDED,&dwThreadID);

ResumeThread(FThread);
}

DWORD WINAPI DisplayData(LPVOID param)
{

while(TRUE)
{

//...DisplayData

if(bExit)
ExitThread(0);

}
return 0;
}

void CTestView::OnButtonStop() //退出
{
bExit = true;
}
reneeland 2009-08-27
  • 打赏
  • 举报
回复
我也是用termiate,我也知道这样不是很好,但貌似没有什么好的办法~~~
MARK一下~~~关注中~~~
  • 打赏
  • 举报
回复
while(bRun)


结束
bRun = FALSE;
  • 打赏
  • 举报
回复
用CloseHandle来做清理工作,TerminateThread貌似是最直接,有效的。
  • 打赏
  • 举报
回复
BOOL WINAPI TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);

vcmfcjavabbs 2009-08-26
  • 打赏
  • 举报
回复
我不知道迅雷是怎么做到的。有没有好的办法啊。我现在的项目卡在这里了。
greatws 2009-08-26
  • 打赏
  • 举报
回复
只有用标志去判断,我觉得没有其他办法
ziplj 2009-08-26
  • 打赏
  • 举报
回复
也可以发送线程消息
ziplj 2009-08-26
  • 打赏
  • 举报
回复
ExitThread 通过别的线程来结束

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧