但是我没用过,不知道要如何实现,望高手帮忙,谢谢!
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);
}
后面就会自己结束啦。
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帮你.
}
if(pThread=AfxBeginThread(CMServer::NewThread, m_pMServer, THREAD_PRIORITY_LOWEST,
0, CREATE_SUSPENDED, NULL))
{
pThread->m_bAutoDelete=true;//设为真,就不需要你操心删除了,mfc帮你.
}
#9
这个很危险吧,一般都应该等线程函数执行完就自动结束了
#10
设置一个线程运行标识, 通过判断标识 使线程自己退出
#11
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);
}
后面就会自己结束啦。
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帮你.
}
if(pThread=AfxBeginThread(CMServer::NewThread, m_pMServer, THREAD_PRIORITY_LOWEST,
0, CREATE_SUSPENDED, NULL))
{
pThread->m_bAutoDelete=true;//设为真,就不需要你操心删除了,mfc帮你.
}
#9
这个很危险吧,一般都应该等线程函数执行完就自动结束了
#10
设置一个线程运行标识, 通过判断标识 使线程自己退出
#11
while(1)
{
if(!m_bIsToEnd)
{
……
}
sleep(sometime);
}