如何正确终止线程

jluliuchao 2008-11-11 12:09:20
在对话框中新建了一个线程
.h
static DWORD WINAPI RecvVideoProc(LPVOID lpParameter);
.cpp
SENDPARAM *pRecvParamVS=new SENDPARAM;
pRecvParamVS->sock=m_socket_udpvs;
pRecvParamVS->sockaddr=addrTo;
HANDLE hThread3=CreateThread(NULL,0,SendVideoProc,(LPVOID)pRecvParamVS,0,NULL);
CloseHandle(hThread3);

我该如何终止和重启线程呢?
由于线程处理函数是static,不能访问变量,使用事件对象(通过SetEvent和ReSetEvent)不行,还有其它方法吗?
...全文
322 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
danscort2000 2008-11-14
  • 打赏
  • 举报
回复
最简单的方法
把.h中的
static DWORD WINAPI RecvVideoProc(LPVOID lpParameter);
移动到.cpp中,定义在全局变量后面,去掉static也可以
这样就可以访问全局变量[定义在该函数前的]

至于线程结束,最好的方法就是让它自己退出,用个全局volatile bool mb_end这样的变量去检测是否要结束就可以了
caitian6 2008-11-14
  • 打赏
  • 举报
回复
用 全局变量 最简单
Edward 2008-11-13
  • 打赏
  • 举报
回复
线程函数代码结束就意味着线程结束,就是你可以用return来结束线程。
ljp0606 2008-11-13
  • 打赏
  • 举报
回复
怎么觉得设置线程结束标识时好时坏呢?当线程工作量(可能是由于工作量哦)特别大时主线程中虽然设置了退出标识,但是线程还是照样运行,根本就没有按照设定退出线程?请问那位大侠知道什么原因嘛?最安全和最可靠的结束线程应该怎么解决哦?
sys0005 2008-11-11
  • 打赏
  • 举报
回复
把线程声明为静态成员函数。
例子代码:

class A
{
public:
BOOL Start();
static DWORD WINAPI RecvVideoProc(LPVOID lpParameter);
void DoWork() {}
private:
HANDLE m_hThread;
}

BOOL A::Start()
{
m_hThread=CreateThread(NULL,0,SendVideoProc,(LPVOID)pRecvParamVS,0,NULL);
return m_hThread ? FASLE : TRUE;
}
DWORD WINAPI A::RecvVideoProc(LPVOID lpParameter)
{
A *a = (A*)lpParameter;
p->DoWork();
return 0;
}

在DoWork函数里可以访问成员变量。

PS:如果是MFC的程序,不要再线程中对界面进行直接的操作,要通过发自定义消息给界面线程,然后由界面线程来处理。
shenyi0106 2008-11-11
  • 打赏
  • 举报
回复
unsigned Thread(LPVOID)
{
.......
while(isRun) //控制此变量
{
......
}
return 0; //让线程函数自己返回
}
csgdseed 2008-11-11
  • 打赏
  • 举报
回复
线程中判断条件,再退出比较好
路人乙2019 2008-11-11
  • 打赏
  • 举报
回复
你还可以做个标记,BOOL bExit;线程中判断它的值,为真是自动退出。
sys0005 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jluliuchao 的回复:]
能解释一下为什么可以这样吗?
A *a = (A*)lpParameter;
a->DoWork();

lpParameter里的内容应该是pRecvParamVS,而pRecvParamVS是自定义结构体的变量
[/Quote]

汗,笔误。
应该是:

BOOL A::Start()
{
m_hThread=CreateThread(NULL,0,SendVideoProc,(LPVOID)this,0,NULL);
return m_hThread ? FASLE : TRUE;
}

jluliuchao 2008-11-11
  • 打赏
  • 举报
回复
能解释一下为什么可以这样吗?
A *a = (A*)lpParameter;
a->DoWork();

lpParameter里的内容应该是pRecvParamVS,而pRecvParamVS是自定义结构体的变量
ok208043624 2008-11-11
  • 打赏
  • 举报
回复
安全退出线程:
//先自己创建一个HANDLE,用于安全退出的
hExit = CreateEvent(NULL,TRUE,FALSE,NULL);
....
//然后在线程函数中:
HANDLE h1[2]={hExit,hYourHandle };
DWORD dwResult1;
for(;;)
{
dwResult1=::WaitForMultipleObjects (2,h1,FALSE,INFINITE);
if(dwResult1==WAIT_OBJECT_0)
{
//Do Your Work...
return 0;
}
else if(dwResult1==WAIT_OBJECT_0+1)
{...}
...
}
...
//然后在Destroy中:
SetEvent(hExit);
palmax 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 jluliuchao 的帖子:]
由于线程处理函数是static,不能访问变量,使用事件对象(通过SetEvent和ReSetEvent)不行,还有其它方法吗?
[/Quote]

明显的概念错误。
静态函数不能访问变量? 不能访问 this->m_xxx 这样的变量倒是正确的,但是说不能访问变量那就是错误的。
只要把类指针传给线程过程参数,一样可以访问。
wltg2001 2008-11-11
  • 打赏
  • 举报
回复
由于线程处理函数是static,不能访问变量,使用事件对象(通过SetEvent和ReSetEvent)不行,还有其它方法吗?
=======================================
可以用全局变量来进行控制。
chenliankun 2008-11-11
  • 打赏
  • 举报
回复
把要处理的变量传过去就可以操作了,就象楼上示范的。
停止或启动线程,只要处理hThread3

15,471

社区成员

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

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