如何关闭用AfxBeginThread创建的线程

时间:2022-11-17 19:14:26
如何关闭用AfxBeginThread创建的线程?听说用PostThreadMessage和PeekMessage会比较好,
但是我没用过,不知道要如何实现,望高手帮忙,谢谢!

11 个解决方案

#1


这要看你的线程是如何运行的。如果线程在执行消息循环,应该用PostThreadMessage的方式给线程发消息,线程收到消息后主动退出。

#2


如果是其它方式,不是消息循环了?

#3


直接用AfxTermThread()行么;       

#4


AfxEndThread()

#5


AfxEndThread(),或者设置一个 标志位等,置位后,线程自己return退出

#6


一般设置一个事件,当需要将线程退出时,设置事件信号,在从线程中检测事件信号然后break线程的循环 退出线程

#7


 外部线程给线程发送消息,自线程收到此消息之后,给自己发送WM_QUIT
 PostThreadMessage(WM_QUIT, wParam, LParam)

但是非UI线程没有自己的消息循环的,你自己得弄一个。

第一步:子线程内重载PreTranslateMessage
BOOL CTcpIpThread::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message) {
case MYMSG_THREADTEST:
OnMyMsgThreadTest(pMsg->wParam, pMsg->lParam);
break;
case MYMSG_CLOSECONN:
OnMyMsgCloseConn(pMsg->wParam, pMsg->lParam);
break;
}

return CWinThread::PreTranslateMessage(pMsg);
}

外部线程给子线程发送消息,此时发送的是MYMSG_CLOSECONN,
PostThreadMessage(nThreadID, MYMSG_CLOSECONN, wParam, lParam);

自线程收到MYMSG_CLOSECONN后,然后Post WM_QUIT给自己。
void CTcpIpThread::OnMyMsgCloseConn(WPARAM wParam, LPARAM lParam)
{
TRACE("MYMSG_CLOSECONN received!\n");
this->PostThreadMessage(WM_QUIT, 0, 0);
::WaitForSingleObject(m_hEventReadyToDead, INFINITE);
::CloseHandle(m_hEventReadyToDead);
::CloseHandle(m_hThread);
}
后面就会自己结束啦。

#8


CWinThread *pThread;
if(pThread=AfxBeginThread(CMServer::NewThread, m_pMServer, THREAD_PRIORITY_LOWEST,
0, CREATE_SUSPENDED, NULL))
{
pThread->m_bAutoDelete=true;//设为真,就不需要你操心删除了,mfc帮你.
}

#9


引用 3 楼 fangchao918628 的回复:
直接用AfxTermThread()行么;      

这个很危险吧,一般都应该等线程函数执行完就自动结束了

#10


设置一个线程运行标识, 通过判断标识 使线程自己退出

#11


引用 10 楼 heksn 的回复:
设置一个线程运行标识, 通过判断标识 使线程自己退出

while(1)
{
if(!m_bIsToEnd)
{

……


}
sleep(sometime);

}

#1


这要看你的线程是如何运行的。如果线程在执行消息循环,应该用PostThreadMessage的方式给线程发消息,线程收到消息后主动退出。

#2


如果是其它方式,不是消息循环了?

#3


直接用AfxTermThread()行么;       

#4


AfxEndThread()

#5


AfxEndThread(),或者设置一个 标志位等,置位后,线程自己return退出

#6


一般设置一个事件,当需要将线程退出时,设置事件信号,在从线程中检测事件信号然后break线程的循环 退出线程

#7


 外部线程给线程发送消息,自线程收到此消息之后,给自己发送WM_QUIT
 PostThreadMessage(WM_QUIT, wParam, LParam)

但是非UI线程没有自己的消息循环的,你自己得弄一个。

第一步:子线程内重载PreTranslateMessage
BOOL CTcpIpThread::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message) {
case MYMSG_THREADTEST:
OnMyMsgThreadTest(pMsg->wParam, pMsg->lParam);
break;
case MYMSG_CLOSECONN:
OnMyMsgCloseConn(pMsg->wParam, pMsg->lParam);
break;
}

return CWinThread::PreTranslateMessage(pMsg);
}

外部线程给子线程发送消息,此时发送的是MYMSG_CLOSECONN,
PostThreadMessage(nThreadID, MYMSG_CLOSECONN, wParam, lParam);

自线程收到MYMSG_CLOSECONN后,然后Post WM_QUIT给自己。
void CTcpIpThread::OnMyMsgCloseConn(WPARAM wParam, LPARAM lParam)
{
TRACE("MYMSG_CLOSECONN received!\n");
this->PostThreadMessage(WM_QUIT, 0, 0);
::WaitForSingleObject(m_hEventReadyToDead, INFINITE);
::CloseHandle(m_hEventReadyToDead);
::CloseHandle(m_hThread);
}
后面就会自己结束啦。

#8


CWinThread *pThread;
if(pThread=AfxBeginThread(CMServer::NewThread, m_pMServer, THREAD_PRIORITY_LOWEST,
0, CREATE_SUSPENDED, NULL))
{
pThread->m_bAutoDelete=true;//设为真,就不需要你操心删除了,mfc帮你.
}

#9


引用 3 楼 fangchao918628 的回复:
直接用AfxTermThread()行么;      

这个很危险吧,一般都应该等线程函数执行完就自动结束了

#10


设置一个线程运行标识, 通过判断标识 使线程自己退出

#11


引用 10 楼 heksn 的回复:
设置一个线程运行标识, 通过判断标识 使线程自己退出

while(1)
{
if(!m_bIsToEnd)
{

……


}
sleep(sometime);

}