●●●●我该什么时候终止线程?●●●●

watercolo007 2003-08-20 02:44:18
函数0:
thread()
{
while(...)
{
case1: Func1();
case2: Func2();
}
}

子函数1:
Func1()
{
while(...)
{... }
}
子函数2:
Func2()
{
while(...)
{... }
}
我想在子函数1和子函数2执行的任何时候都可以调用下面的代码使该线程停止
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if( WM_THREAD_EXIT == msg.message )
{
if (pthrdInfo->WaitForTerminate(0) != WAIT_TIMEOUT)
return CM_HANDLER_EXIT;
}

但是由于这是个两重循环停止的动作不够实时,效果不好!
有没有更好的方案???


...全文
44 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengwei_xj 2003-09-09
  • 打赏
  • 举报
回复
>>多声明几个volatile的线程控制变量,一个变量控制一个线程不就行了,而且你的线程中止控制也不一定非得在PeekMessage后写,在任何需要的地方都可以写
volatile关键字是做什么的,哪位能解释一下吗?
sumkeen 2003-09-08
  • 打赏
  • 举报
回复
用全局变量加上消息两种方法同时使用吧。效果很好
watercolo007 2003-08-21
  • 打赏
  • 举报
回复
结贴
mme 2003-08-20
  • 打赏
  • 举报
回复
同意楼上所说的全局变量控制
gzshd 2003-08-20
  • 打赏
  • 举报
回复
多声明几个volatile的线程控制变量,一个变量控制一个线程不就行了,而且你的线程中止控制也不一定非得在PeekMessage后写,在任何需要的地方都可以写
watercolo007 2003-08-20
  • 打赏
  • 举报
回复
main()
{
for(...)
{
_beginThread(my_thread,...);
}
}

my_thread()
{
while(...)
{
case 1: func1(); break;
case 2: func2(); break;
}
}

func1()
{
while(...)
{
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if( WM_THREAD_EXIT == msg.message )
{
return CM_HANDLER_EXIT;
}
longTimeDo(); //问题:只有当这个长时间的处理完了,才能接受msg,从而导致该线程不能及时停止.
}
}
watercolo007 2003-08-20
  • 打赏
  • 举报
回复
to gzshd(郁?) :

我是多个线程的情况,并且线程函数体是相同的.
用volatile全局量,so在my_thread函数里判断要停止一个my_thread就困难了!
而我利用PostThreadMessage可以停止相同的线程(尽管线程执行的功能相同).
见下面祥细说明:
晨星 2003-08-20
  • 打赏
  • 举报
回复
这种比较简单的情况使用还是使用全局变量方便。
定义全局变量别忘了使用“volatile”关键字。
vcforever 2003-08-20
  • 打赏
  • 举报
回复
用一个全局变量
试一下吧!在线程之内检测这个变量!
mfc168 2003-08-20
  • 打赏
  • 举报
回复
同意 gzshd(郁闷),其实归纳起来有两种方式:1,全局变量,正如楼上所写的;
2,进程间通信,IPX,这个比较难,很难控制,容易引起死锁
gzshd 2003-08-20
  • 打赏
  • 举报
回复
函数0:
volatile bool stop=false;

thread()
{
while(!stop)
{
case1: Func1();
case2: Func2();
}
}

子函数1:
Func1()
{
while(...)
{... }
}
子函数2:
Func2()
{
while(...)
{... }
}
当终止线程时:
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if( WM_THREAD_EXIT == msg.message )
{
stop=true;
}
flinming 2003-08-20
  • 打赏
  • 举报
回复
HANDLE m_hThread; //线程句柄
在子函数1和子函数加入下面代码停止线程
/*******************************************************************************
* 退出线程 *
*******************************************************************************/
int ExitThread()
{
if (TerminateThread(XTApp->Thread.m_hThread, 4))
{
DWORD dwExitCode =0;
while(TRUE)
{
GetExitCodeThread(XTApp->Thread.m_hThread, &dwExitCode);
if (dwExitCode != STILL_ACTIVE)
break;
Sleep(10);
}
CloseHandle(XTApp->Thread.m_hThread);
}

return 0;
}
watercolo007 2003-08-20
  • 打赏
  • 举报
回复
Helping Continue... !!!
watercolo007 2003-08-20
  • 打赏
  • 举报
回复
thanks
wj59 2003-08-20
  • 打赏
  • 举报
回复
帮你up

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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