VC中多线程的创建与正常退出

Tobby0419 2008-05-07 11:34:13
我想做一个对话框的程序,在按钮1中创建线程,同时创建一个标志量,在另一个按钮中判断该变量,若条件为真,则退出线程,否则,挂起线程。目前只会创建和挂起线程,主要是想问问退出线程怎么实现?还有这种方式能否实现,谢谢!
...全文
1950 17 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
没有更好的方案吗?谢谢!

15,466

社区成员

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

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