社区
进程/线程/DLL
帖子详情
VC中多线程的创建与正常退出
Tobby0419
2008-05-07 11:34:13
我想做一个对话框的程序,在按钮1中创建线程,同时创建一个标志量,在另一个按钮中判断该变量,若条件为真,则退出线程,否则,挂起线程。目前只会创建和挂起线程,主要是想问问退出线程怎么实现?还有这种方式能否实现,谢谢!
...全文
1950
17
打赏
收藏
VC中多线程的创建与正常退出
我想做一个对话框的程序,在按钮1中创建线程,同时创建一个标志量,在另一个按钮中判断该变量,若条件为真,则退出线程,否则,挂起线程。目前只会创建和挂起线程,主要是想问问退出线程怎么实现?还有这种方式能否实现,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lake_cx
2008-05-14
打赏
举报
回复
退出线程最好的办法就是让线程自己结束
自己结束是什么意思知道吧?就是线程函数执行完了,没东西执行了,它就结束了。
说白了就是在线程中塞个循环,一直判断某个标志,如果标志表示要结束线程,return一下,函数就返回了,线程就结束了
krispan86
2008-05-13
打赏
举报
回复
[Quote=引用 14 楼 Tobby0419 的回复:]
这个void ExitThread()
{
SetEvent(...);
....
}
什么意思啊,…
[/Quote]
给你个链接自己看看吧:http://blog.chinaunix.net/u/14819/showart_188455.html
小麻侬
2008-05-13
打赏
举报
回复
UP
Tobby0419
2008-05-12
打赏
举报
回复
[Quote=引用 10 楼 raymonzhao 的回复:]
线程退出这跟你的线程的逻辑有关的.
如果你的线程体中可以用一个循环来做的话,那加一个事件来判断就好了.
DWORD YouThreadProc()
{
while(YourCondition && WaitForSingalObject....)
{
....
}
}
void ExitThread()
{
SetEvent(...);
....
}
[/Quote]
这个void ExitThread()
{
SetEvent(...);
....
}
什么意思啊,没有怎么弄懂,谢谢!
Tobby0419
2008-05-09
打赏
举报
回复
[Quote=引用 10 楼 raymonzhao 的回复:]
线程退出这跟你的线程的逻辑有关的.
如果你的线程体中可以用一个循环来做的话,那加一个事件来判断就好了.
DWORD YouThreadProc()
{
while(YourCondition && WaitForSingalObject....)
{
....
}
}
void ExitThread()
{
SetEvent(...);
....
}
[/Quote]
不知道能否收得详细些,谢谢!我对消息的机制不是很熟悉。
tnfyj
2008-05-09
打赏
举报
回复
[Quote=引用 5 楼 wutaozhao 的回复:]
退出线程用TerminateThread(HANDLE, exitCode)
[/Quote]
这种方法很危险啊。。。 这样需要你自己释放在 被强行终结的线程中创建的所有资源。。。
如楼上所说:WaitForMultiplyObjects 才是正道。。。如果想等待单个线程结束
还可以有WaitForSignleObject
buyong
2008-05-09
打赏
举报
回复
线程正常退出的话你waitformultiplyobjects就行,退出了就关闭句柄。
如果想强行终止线程,就TerminalThread,不推荐,什么内存泄露,critical section未释放等一堆问题
或者主程序设个event,通知其他线程,在其他线程内部wait这个event,自己进行终止操作。主线程等待其完成。
raymonzhao
2008-05-09
打赏
举报
回复
线程退出这跟你的线程的逻辑有关的.
如果你的线程体中可以用一个循环来做的话,那加一个事件来判断就好了.
DWORD YouThreadProc()
{
while(YourCondition && WaitForSingalObject....)
{
....
}
}
void ExitThread()
{
SetEvent(...);
....
}
圣陶沙
2008-05-08
打赏
举报
回复
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE
);
用AfxBeginThread创建,用AfxEndThread结束不行吗?
Tobby0419
2008-05-07
打赏
举报
回复
可能是我没有说清楚,我是想按钮1创建线程,当条件满足时 按钮2实现线程的退出。因为这个对话框程序中,使用了太多的线程,而且每个线程都调用了多媒体定时器,内存的消耗比较大。谢谢!
小麻侬
2008-05-07
打赏
举报
回复
退出线程用TerminateThread(HANDLE, exitCode)
Tobby0419
2008-05-07
打赏
举报
回复
[Quote=引用 1 楼 laiyiling 的回复:]
WINAPI void YourThreadPrcc (LPARAM lParam)
{
CYourClass *p = (CYourClass*)lParam;
while ( p->m_bFlag)
{
//..... Running
}
}
void CYourClass::OneMethod() // 这个类同时包含一个BOOL的标志
{
DWORD dwThreadId;
HANDLE hThread;
hThread = CreateThread(NULL, 0, MyThread, this, 0, &dwThreadId);
}
[/Quote]
不好意思,没怎么看懂。是p->m_bFlag为true时,线程执行,是吗?
我想实现的是线程退出,确切的说是关闭掉线程,让其退出进程,不是线程挂起啊。
Tobby0419
2008-05-07
打赏
举报
回复
[Quote=引用 2 楼 aunkbk 的回复:]
即然LZ很喜欢用标志量,那就再加上一个标志量做为线程退出的标记,然后在线程中做判断就可以了~
[/Quote]
您的意思还有别的方法,不知道能否说说!
aunkbk
2008-05-07
打赏
举报
回复
即然LZ很喜欢用标志量,那就再加上一个标志量做为线程退出的标记,然后在线程中做判断就可以了~
Kudeet
2008-05-07
打赏
举报
回复
WINAPI void YourThreadPrcc (LPARAM lParam)
{
CYourClass *p = (CYourClass*)lParam;
while ( p->m_bFlag)
{
//..... Running
}
}
void CYourClass::OneMethod() // 这个类同时包含一个BOOL的标志
{
DWORD dwThreadId;
HANDLE hThread;
hThread = CreateThread(NULL, 0, MyThread, this, 0, &dwThreadId);
}
danscort2000
2008-05-07
打赏
举报
回复
用一个全局变量
volatile static int mi_threadkill;
在启动前
设置 mi_threadkill=0;
在线程中
需要随时检测KILL的值
while(mi_threadkill==0)
{
your code
Sleep(sometime);
这个代码的关键是不能长时间阻塞
}
return 0;
当你想结束线程的时候,只需要
在外部设置
mi_threadkill=1;
就可以让线程退出
Tobby0419
2008-05-07
打赏
举报
回复
没有更好的方案吗?谢谢!
VC
初级
多线程
编程实例源码集.rar
个人整理的一些比较基础的
VC
初级
多线程
编程实例集,包括安全终止线程、
创建
UI线程、
创建
Worker线程、等待线程结束、挂起和恢复线程、获得线程的
退出
码、使用互斥量、使用临界区、使用信号量等内容,相信对
VC
初学者...
VC
++MFC
多线程
个种实例
10.1 如何
创建
Worker线程 10.2 如何
创建
UI线程 10.3 如何等待线程结束 10.4 如何挂起和恢复线程 10.5 如何安全终止线程 10.6 如何获得线程的
退出
码 10.7 如何使用临界区 10.8 如何使用互斥量 10.9 如何使用信号量 ...
HTTP代理服务器
VC
实现的,源代码
主要介绍
多线程
编程相关的知识,包括初始化临界段和删除临界段,使用临界段完成多个线程对临界资源的互斥访问,
创建
工作线程,
退出
工作线程,定义和设定事件,利用事件完成多个线程的同步与协作等。
java源码包---java 源码 大量 实例
在有状态SessionBean
中
,用累加器,以对话状态存储起来,
创建
EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存
中
清除…… Java Socket 聊天...
java源码包2
在有状态SessionBean
中
,用累加器,以对话状态存储起来,
创建
EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存
中
清除…… Java Socket 聊天...
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章