AfxBeginThread(..)创建的线程 如何在关闭程序前杀死它?

com235 2001-06-04 04:55:00
AfxBeginThread(..)创建的线程 如何在关闭程序前杀死它?
AfxBeginThread(abcd..)

UINT abcd(....)
{
for(;;)
{
.....;
}
}
...全文
524 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
com235 2001-06-07
谢谢各位,我都糊涂了
回复
com235 2001-06-05
Echo?
回复
littleme741 2001-06-05
To clack(千里快哉风):

你这个话:
如果是单线程的话,似乎会把整个进程都杀死,我也挺纳闷的,就算是用户界面线程也不应该把我的进程都关了吧?关注!
是否有问题,如果一个进程是单线程的话,该线程关掉了,进程当然就结束了。这有疑问么?
难道还存在一个没有任何线程的进程?呵呵。你仔细想一想。
回复
littleme741 2001-06-05
同意vcbear(欢~乐~总~灌~水~耶)和edyang(石头)的方法。
不过我个人推荐用事件(EVENT),然后waitforsingleobject,这个比较简单实用,而且你在线程中可能根本就没有消息循环呢,如果你的子线程很简单的话。对不对?呵呵。
回复
Edward 2001-06-04
int CWinThread::Run()
{
ASSERT_VALID(this);

// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;

// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}

// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();

// reset "no idle" state after pumping "normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}

} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
}

ASSERT(FALSE); // not reachable
}
回复
Edward 2001-06-04
大概 3 个方法:
1、上面大虾们所说的强行终止,但是不推荐,最好用下面的技巧。
2、for(;;) 用一个条件来结束循环,如:
BOOL bFlag;

bFlag = TRUE;
AfxBeginThread(f, &bFlag);

UINT f(LPVOID lpParam)
{
BOOL* pFlag;

pFlag = (BOOL *)lpParam;
while(!pFlag)
{
// do work
}
return 0;
}

在你的主线程里面把 bFlag = FALSE; 即可推出自然退出线程。
用 WaitForSingleObject 可以避免在 debug 方式下出现的一个假的内存泄漏警告。
2、用 PeekMessage 来察看是否有 WM_QUIT 消息,在你的主线程中可以 pWinThread->PostThreadMessage(WM_QUIT, 0, 0); 来通知线程结束。
具体的实现可以参考 CWinThread::Run 的 MFC 源代码。
回复
sinx 2001-06-04
m_pThread->m_bAutoDelete=FALSE; //运行之前设置 , m_pThread 为线程指针
.....

AfxEndThread(UINT nExitCode,BOOL bDelete);//结束线程
delete m_pThread;
回复
chief 2001-06-04
你應該使用WaitSingleObject(線程句柄)來等待線程退出,而不應用sleep.
另外,你的線程是使用循環測試stoploop=false來控制線程的退出嗎? 如果這樣的話,你應把stoploop變量聲明前加上 volatile 標志。要不然优化程序會將你的stoploop改為寄存器變量,這樣,不管你如何在主線程中改變stoploop, 子線程中的stoploop始終會為false。你的線程也就...不會結束了。
回复
seesi 2001-06-04
主线程死了他还不死
回复
com235 2001-06-04
Goon Please
我用一全局变量 StopLoop,
onExit()
{
StopLoop = true;
AfxMessageBox("Are you Sure?");
Sleep(2000); //给线程以时间退出
AfxMessageBox("Now I Will Quit.");
}
可线程被Sleep() 阻塞了似的.
回复
clack 2001-06-04
如果是单线程的话,似乎会把整个进程都杀死,我也挺纳闷的,就算是用户界面线程也不应该把我的进程都关了吧?关注!
回复
enterzhuang 2001-06-04
TerminateThread或通过通信
回复
flagfly 2001-06-04
TerminateThread()杀不死,不会吧,我来试试。
回复
hproof 2001-06-04
进程关闭后线程自动关闭的,不用麻烦你老人家了。
回复
robotsoft 2001-06-04
可能是没有创建时没有将
m_bAutoDelete = TRUE
回复
jsd198 2001-06-04
我试过用此函数返回的CWinThread对像,用TerminateThread(
HANDLE hThread, // handle to thread
DWORD dwExitCode // exit code
);
来终止线程,但我在WINDOWS的任务管理器中看,此线程并没有被杀死,我也在想这个问题
欢迎和我联系,如果解决请告诉我
有一个方法是,用一个全局变量,在线程的处理函数中放置一个检查此变量的判断,然后使用
return自然返回,但这有一个问题,你的这个判断放在什么地方,一般应放在最为耗时的地方,
如果运行过这个地方就没有作用,如国没有运行过,要等待
我的认识就这些!谨供参考!
回复
vcbear 2001-06-04
获的AfxBeginThread返回的CWinThread指针,比如pThread.
在退出前通过一些操作使abcd返回(或者TerminateThread强行终止线程,不推荐),
用WaitSingleOject(pThread->m_hThread)等待线程结束。
回复
com235 2001-06-04
Echo?
回复
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2001-06-04 04:55
社区公告
暂无公告