如何关闭正在阻塞的子线程
自娱自乐。 2020-04-17 01:15:43 子线程就是进行网络连接,然后就一直等待接收数据,可以正常实现接收功能,但是在关闭程序的时候会报错内存泄漏,猜测原因是recv,是个阻塞函数,在主程序的onclose中发送关闭子程序的标志位和发送自定义关闭消息两种方式,都不能进入到子线程中去关闭,也试过sleep一定时间,请问有什么好的方式,关闭正在阻塞的子线程?
UINT MyThreadProc(LPVOID pParam)
{
char buff[2000];
int n;
SOCKET Client = ((RECVPARAM*)pParam)->sock;
HWND hWnd = ((RECVPARAM*)pParam)->hwnd;
SOCKADDR_IN Addr = ((RECVPARAM*)pParam)->addr;
if (SOCKET_ERROR == connect(Client, (SOCKADDR*)&Addr, sizeof(SOCKADDR)))
{
int nError = WSAGetLastError();
CString strErrorMsg;
SendMessage(hWnd, WM_NETERROR, 0, 0);
return FALSE;
}
::SendMessage(hWnd, WM_NETCONNECTED, 0, 0);//网络连接成功
while (TRUE)
{
memset(buff, 0, sizeof(buff));
n = recv(Client, buff, sizeof(buff), 0);//阻塞,n是拷贝的字节数
if (n == 0)//网络连接断开时,例如关闭服务器
{
SendMessage(hWnd, WM_NETERROR, 0, 0);
return 0;
}
if (n == SOCKET_ERROR)
{
SendMessage(hWnd, WM_NETERROR, 0, 0);
return 0;
}
::SendMessage(hWnd, WM_RECVDATA, (WPARAM)n, (LPARAM)buff);
}
return TRUE;
}