子執行緒就是進行網路連接,然后就一直等待接收資料,可以正常實作接收功能,但是在關閉程式的時候會報錯記憶體泄漏,猜測原因是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;
}
uj5u.com熱心網友回復:
最好的辦法是結束回圈,退出執行緒。設一個標識,子執行緒中碰到標志就退出,等所有執行緒都退出了再退出主行程if (theApp.m_mutexExit.isLocked()) //正在退出,中斷
return;
也可以強行殺死執行緒
m_pThread->m_bAutoDelete = TRUE;
DWORD ExitCode;
GetExitCodeThread(m_pThread->m_hThread, &ExitCode);
TerminateThread(m_pThread->m_hThread, ExitCode);
uj5u.com熱心網友回復:
強制殺死執行緒會導致記憶體泄漏Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {369} client block at 0x00D45DD8, subtype c0, 68 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CWinThread object at $00D45DD8, 68 bytes long
我設定了一個全域的標志位,在關閉主視窗時將標志位設定為true,在while中判斷標志若為true就return,但是除錯發現標志位設定成功了,但是卻不進入到子執行緒中去就直接退出了程式,依舊記憶體泄漏
uj5u.com熱心網友回復:

優雅的關閉socket.
uj5u.com熱心網友回復:
請問具體怎么操作?uj5u.com熱心網友回復:
推薦 ioctlsocket FIONBIO 異步模式,這樣就有機會檢測退出標記了
uj5u.com熱心網友回復:
主執行緒中加一行WaitForSingleObject(m_pThread->m_hThread, 500); // 等待執行緒結束
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/16911.html
標籤:進程/線程/DLL
