大家好,第一次搞windows編程,最近碰到一個很棘手的問題。搞不定了,在線等各位高手好心求救!
【背景】socket是一個執行緒中的成員,這個執行緒的解構式里面,有關閉socket,delete socket
【原代碼邏輯】
1. 該執行緒收到killThread,會SetEvent(m_killevent)事件,之后會進入InitInstance-> ExitInstance,這樣就結束執行緒了。
2. 然后其他呼叫點,會呼叫delete pthread將該執行緒析構。再關閉socket,delete socket。
【現在代碼邏輯】
1. 該執行緒改為訊息處理的模式。,收到killThread,會發送KILL_THREAD訊息給PreTranslateMessage,它收到后,會呼叫API: ExitThread.
2. 其他呼叫點,會呼叫delete pthread將該執行緒析構。再關閉socket,delete socket,這些都沒變。還是原來的邏輯。
【問題】代碼改為現在的邏輯后,關閉socket的時候,拋例外。關閉之后有判斷socket是否為NULL,非NULL,才關閉,后delete socket,在socket->close()的時候拋例外。
【求助】
1. socket->close的時候拋例外,用CException類沒抓到例外。可以呼叫哪個介面捕捉例外?查看具體錯誤型別。
2. 把socket->close注釋掉,也不行。會在delete socket拋例外。
3. ExitThread 這個API介面是不是不對?那可以呼叫什么介面呢?然后其他呼叫點還是呼叫delete pthread不變。
4. 按照現在代碼的邏輯,ExitThread -> delete pthread是否不對?
5. 還有什么定位手段嗎?
uj5u.com熱心網友回復:
PS:代碼中呼叫delete pthread的地方有兩處。 只有一個地方delete pthread里面的 socket->close出問題了,另一個地方沒出問題。
uj5u.com熱心網友回復:
PS:InitInstance 改為 PreTranslateMessage的原因:
1. 因為有一個執行緒,我要post訊息給該執行緒,該執行緒為了能接收到該訊息,所以我把介面改為 PreTranslateMessage。
uj5u.com熱心網友回復:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx《Windows核心編程》
uj5u.com熱心網友回復:
訊息接收到了,但是還沒執行關閉Socket->Close();主執行緒退出了,然后子執行緒也就退出了,造成記憶體泄漏,所以需要Waitforsigleobject函式等待Socket全部關閉,然后子執行緒再退出。uj5u.com熱心網友回復:
socket->close 處設定個斷點,除錯運行, 懷疑存在多次deleteuj5u.com熱心網友回復:
哥們,能不能說詳細點?主執行緒不能退出吧?主執行緒不是應該一直在跑嗎?
uj5u.com熱心網友回復:
有設定斷點,跑到這個地方VC直接例外,錯誤:unhandled exception in Exchange.exe(MFCN42D.DLL):0xc00000005:Access Violation.
uj5u.com熱心網友回復:
另外:WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, 0)
這個是表示我的執行緒有沒有信號啊?
uj5u.com熱心網友回復:
WAIT_OBJECT_0 0x00000000 :指定的物件出有有信號狀態
WAIT_TIMEOUT 0x00000102:等待超時
WAIT_FAILED 0xFFFFFFFF :出現錯誤,可通過GetLastError得到錯誤代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/126458.html
標籤:網絡編程
