我在线程中recvfrom,
执行到recvfrom时就开始等待,
如果我想结束该线程除了TerminateThread(会造成资源无法释放),
还有什么其他方法吗?
执行到recvfrom时就开始等待,
如果我想结束该线程除了TerminateThread(会造成资源无法释放),
还有什么其他方法吗?
解决方案 »
- VS2005中Cstring 和const char*的问题
- Tinyxml的一个问题
- MFC 全局热键 多个实例 使用
- 命名管道的client连接远程server
- 那里有windows核心编程配套光盘下载!
- 我有一个数据表mytable,里面包含20个字段,装了三百条记录。在用VC编程的时候,应该用什么方法最快地创建一个表yourtable,它的内容与表m
- 定义全局变量定义在.h与.cpp中有何不同?
- 如何实现窗口透明化????????????
- 在VC里如何实现QQ的界面啊,急急急急急急急急急急急?
- 新手求教
- 如何把CListCtrl的滚动条移到最底端?
- 如何更改CListCtrl控件中显示每一行中的字体大小
这种做法的原理是closesocket之后,那个执行recvfrom的工作线程则会从recvfrom得到一个错误的返回值(因为套接字被关闭),因而也从阻塞态醒过来,然后退出线程。
--------------------------------------------------------------------------------终止线程有三种方法:
1.线程可以在自身内部调用AfxEndThread()来终止自身的运行2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
然后调用CloseHandle()函数释放线程所占用的堆栈3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。下面的例子来演示第三种方法
全局变量m_end来表示是否要结束线程bool m_end = false;
HWND hWnd;启动线程:
CWinThread* pThread;hWnd = GetSafeHwnd();
pThread = AfxBeginThread(ThreadProc,hWnd);
pThread->m_bAutoDelete = false; 线程的函数
UINT ThreadProc(LPVOID pParam);
UINT ThreadProc(LPVOID pParam)
{
while(!m_end)
{
AfxMessageBox("test;");
::Sleep(2000);
}
return 0;
}终止线程代码
m_end = true;
WaitForSingleObject(pThread->m_hThread,INFINITE); //等待线程结束
delete pThread; //删除线程
• 线程函数返回(最好使用这种方法)。
• 通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。
• 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该避免使用这种方法)。
• 包含线程的进程终止运行(应该避免使用这种方法)。线程函数返回
始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是
确保所有线程资源被正确地清除的唯一办法。
如果线程能够返回,就可以确保下列事项的实现:
• 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。
• 操作系统将正确地释放线程堆栈使用的内存。
• 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
• 系统将递减线程内核对象的使用计数。
{
if (WaitForSingleObject(m_hAcceptMsgEvent, INFINITE) == WAIT_OBJECT_0)
{
是否退出
}
int nResult = WSAEnumNetworkEvents(m_nSocket, m_hAcceptMsgEvent, &ne);
ResetEvent(m_hAcceptMsgEvent);
if (nResult == 0)
{
if (ne.lNetworkEvents & FD_READ)
{
nReceiveLen = recvfrom(m_nSocket, chBuffer, MAX_PACKET_SIZE, 0,
(sockaddr*)&cliAddr, &nAddrLen);
}
}
}
if (ne.lNetworkEvents & FD_CLOSE)
{
退出
}
}
另外,free_card(痛并快乐着),closehandle()可以释放掉线程占有的资源?,毕竟那个socket没有关掉。
你可以使用PostThreadMessage向线程发送消息,在线程中用GetMessage来判断消息以自己结束
如果在一个函数内部阻塞就没有什么好方法了
沒有消息的時候不調用recvfrom,這樣recvfrom就不會阻塞