减少远程桌面new的频次

减少远程桌面new缓冲区的频率,将部分从堆上new固定内存的操作改用从栈上分配内存。
This commit is contained in:
yuanyuanxiang
2019-01-21 21:04:17 +08:00
parent 5aadfc13a6
commit 4283a31e66
9 changed files with 37 additions and 35 deletions

View File

@@ -127,3 +127,9 @@
4、当退出远程桌面窗口全屏状态时不再向远程被控端发送F11。 4、当退出远程桌面窗口全屏状态时不再向远程被控端发送F11。
5、发现在有线网络条件下主控端崩溃几率较小。 5、发现在有线网络条件下主控端崩溃几率较小。
6、禁用主控端输入法解决使用远程桌面在被控端输入时的麻烦问题。
2019.1.21
减少远程桌面new缓冲区的频率将部分从堆上new固定内存的操作改用从栈上分配内存。

View File

@@ -86,7 +86,6 @@ char* RegisterOperation::FindPath()
if(KeyCount>0&&KeySize>1){ if(KeyCount>0&&KeySize>1){
int Size=sizeof(REGMSG)+1; int Size=sizeof(REGMSG)+1;
//buf=new char[KeyCnt*KeySize+size+1];
DWORD DataSize=KeyCount*KeySize+Size+1; //[TOKEN_REG_PATH][2 11 ccccc\0][11][11] DWORD DataSize=KeyCount*KeySize+Size+1; //[TOKEN_REG_PATH][2 11 ccccc\0][11][11]
szBuffer=(char*)LocalAlloc(LPTR, DataSize); szBuffer=(char*)LocalAlloc(LPTR, DataSize);
ZeroMemory(szBuffer,DataSize); ZeroMemory(szBuffer,DataSize);

View File

@@ -28,6 +28,8 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n):CManager(ClientO
m_ScreenSpyObject = new CScreenSpy(16); m_ScreenSpyObject = new CScreenSpy(16);
szBuffer = new char[4 * m_ScreenSpyObject->m_ulFullWidth * m_ScreenSpyObject->m_ulFullHeight];
m_hWorkThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,this,0,NULL); m_hWorkThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WorkThreadProc,this,0,NULL);
} }
@@ -64,8 +66,6 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam)
printf("SendScreen Span = %d ms\n", span); printf("SendScreen Span = %d ms\n", span);
last = clock(); last = clock();
This->SendNextScreen(szBuffer, ulNextSendLength); This->SendNextScreen(szBuffer, ulNextSendLength);
delete[] szBuffer;
szBuffer = NULL;
} }
} }
timeEndPeriod(1); timeEndPeriod(1);
@@ -102,6 +102,11 @@ CScreenManager::~CScreenManager()
delete[] m_ScreenSpyObject; delete[] m_ScreenSpyObject;
m_ScreenSpyObject = NULL; m_ScreenSpyObject = NULL;
if(szBuffer)
{
delete [] szBuffer;
szBuffer = NULL;
}
} }
VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength) VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
@@ -195,16 +200,12 @@ VOID CScreenManager::SendFirstScreen()
} }
ULONG ulFirstSendLength = 1 + m_ScreenSpyObject->GetFirstScreenLength(); ULONG ulFirstSendLength = 1 + m_ScreenSpyObject->GetFirstScreenLength();
LPBYTE szBuffer = new BYTE[ulFirstSendLength];
szBuffer[0] = TOKEN_FIRSTSCREEN; szBuffer[0] = TOKEN_FIRSTSCREEN;
memcpy(szBuffer + 1, FirstScreenData, ulFirstSendLength - 1); memcpy(szBuffer + 1, FirstScreenData, ulFirstSendLength - 1);
m_ClientObject->OnServerSending((char*)szBuffer, ulFirstSendLength); m_ClientObject->OnServerSending((char*)szBuffer, ulFirstSendLength);
szBuffer[ulFirstSendLength] = 0;
delete [] szBuffer;
szBuffer = NULL;
} }
const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength) const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength)
@@ -218,10 +219,9 @@ const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength)
ulNextSendLength += 1; ulNextSendLength += 1;
char* szBuffer = new char[ulNextSendLength];
szBuffer[0] = TOKEN_NEXTSCREEN; szBuffer[0] = TOKEN_NEXTSCREEN;
memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1); memcpy(szBuffer + 1, NextScreenData, ulNextSendLength - 1);
szBuffer[ulNextSendLength] = 0;
return szBuffer; return szBuffer;
} }

View File

@@ -17,6 +17,7 @@ class IOCPClient;
class CScreenManager : public CManager class CScreenManager : public CManager
{ {
public: public:
char* szBuffer;
CScreenManager(IOCPClient* ClientObject, int n); CScreenManager(IOCPClient* ClientObject, int n);
virtual ~CScreenManager(); virtual ~CScreenManager();
HANDLE m_hWorkThread; HANDLE m_hWorkThread;

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<RemoteDebuggerCommand>D:\VM\Remoter\TestRun.exe</RemoteDebuggerCommand> <RemoteDebuggerCommand>C:\VM\Remoter\TestRun.exe</RemoteDebuggerCommand>
<RemoteDebuggerWorkingDirectory>D:\VM\Remoter</RemoteDebuggerWorkingDirectory> <RemoteDebuggerWorkingDirectory>C:\VM\Remoter</RemoteDebuggerWorkingDirectory>
<RemoteDebuggerServerName>192.168.12.248</RemoteDebuggerServerName> <RemoteDebuggerServerName>192.168.43.2</RemoteDebuggerServerName>
<DeploymentDirectory>D:\VM\Remoter</DeploymentDirectory> <DeploymentDirectory>C:\VM\Remoter</DeploymentDirectory>
<AdditionalFiles>$(TargetDir)\TestRun.pdb;$(TargetDir)\ServerDll.dll;$(TargetDir)\ServerDll.pdb</AdditionalFiles> <AdditionalFiles>$(TargetDir)\TestRun.pdb;$(TargetDir)\ServerDll.dll;$(TargetDir)\ServerDll.pdb</AdditionalFiles>
<RemoteDebuggerDeployDebugCppRuntime>false</RemoteDebuggerDeployDebugCppRuntime> <RemoteDebuggerDeployDebugCppRuntime>false</RemoteDebuggerDeployDebugCppRuntime>
<DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>

View File

@@ -83,25 +83,21 @@ void CVideoManager::Destroy()
void CVideoManager::SendBitMapInfor() void CVideoManager::SendBitMapInfor()
{ {
DWORD dwBytesLength = 1 + sizeof(BITMAPINFO); const int dwBytesLength = 1 + sizeof(BITMAPINFO);
LPBYTE szBuffer = new BYTE[dwBytesLength]; BYTE szBuffer[dwBytesLength + 3] = { 0 };
if (szBuffer == NULL) szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO;
return;
szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO; //+ ͷ
memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO)); memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO));
m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength);
delete [] szBuffer;
} }
void CVideoManager::SendNextScreen() void CVideoManager::SendNextScreen()
{ {
DWORD dwBmpImageSize=0; DWORD dwBmpImageSize=0;
LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize); //m_pVideoCap->GetDIB(); LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize);
// token + IsCompress + m_fccHandler + DIB // token + IsCompress + m_fccHandler + DIB
int nHeadLen = 1 + 1 + 4; int nHeadLen = 1 + 1 + 4;
UINT nBufferLen = nHeadLen + dwBmpImageSize;//m_pVideoCap->m_lpbmi->bmiHeader.biSizeImage; UINT nBufferLen = nHeadLen + dwBmpImageSize;
LPBYTE lpBuffer = new BYTE[nBufferLen]; LPBYTE lpBuffer = new BYTE[nBufferLen];
lpBuffer[0] = TOKEN_WEBCAM_DIB; lpBuffer[0] = TOKEN_WEBCAM_DIB;

View File

@@ -2,7 +2,7 @@
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommandArguments>192.168.12.250 2356</LocalDebuggerCommandArguments> <LocalDebuggerCommandArguments>192.168.104.250 2356</LocalDebuggerCommandArguments>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>

View File

@@ -5,6 +5,7 @@
#include "2015Remote.h" #include "2015Remote.h"
#include "ScreenSpyDlg.h" #include "ScreenSpyDlg.h"
#include "afxdialogex.h" #include "afxdialogex.h"
#include <imm.h>
// CScreenSpyDlg <20>Ի<EFBFBD><D4BB><EFBFBD> // CScreenSpyDlg <20>Ի<EFBFBD><D4BB><EFBFBD>
@@ -28,6 +29,7 @@ IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog)
CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject)
: CDialog(CScreenSpyDlg::IDD, Parent) : CDialog(CScreenSpyDlg::IDD, Parent)
{ {
ImmDisableIME(0);// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bFullScreen = FALSE; m_bFullScreen = FALSE;
m_iocpServer = IOCPServer; m_iocpServer = IOCPServer;
@@ -415,7 +417,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
case WM_SYSKEYUP: case WM_SYSKEYUP:
if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: <20>˳<EFBFBD>ȫ<EFBFBD><C8AB> if (pMsg->wParam == VK_F11 && LeaveFullScreen()) // F11: <20>˳<EFBFBD>ȫ<EFBFBD><C8AB>
return true; return TRUE;
if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN) if (pMsg->wParam != VK_LWIN && pMsg->wParam != VK_RWIN)
{ {
MSG Msg; MSG Msg;
@@ -426,7 +428,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg)
SendCommand(&Msg); SendCommand(&Msg);
} }
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
return true;// <20><><EFBFBD><EFBFBD>Enter<65><72>ESC<53>رնԻ<D5B6> return TRUE;// <20><><EFBFBD><EFBFBD>Enter<65><72>ESC<53>رնԻ<D5B6>
break; break;
} }
@@ -439,12 +441,12 @@ VOID CScreenSpyDlg::SendCommand(MSG* Msg)
if (!m_bIsCtrl) if (!m_bIsCtrl)
return; return;
LPBYTE szData = new BYTE[sizeof(MSG) + 1]; const int length = sizeof(MSG) + 1;
BYTE szData[length + 3];
szData[0] = COMMAND_SCREEN_CONTROL; szData[0] = COMMAND_SCREEN_CONTROL;
memcpy(szData + 1, Msg, sizeof(MSG)); memcpy(szData + 1, Msg, sizeof(MSG));
m_iocpServer->OnClientPreSending(m_ContextObject, szData, sizeof(MSG) + 1); szData[length] = 0;
m_iocpServer->OnClientPreSending(m_ContextObject, szData, length);
delete[] szData;
} }
BOOL CScreenSpyDlg::SaveSnapshot(void) BOOL CScreenSpyDlg::SaveSnapshot(void)

View File

@@ -25,6 +25,7 @@ void CTalkDlg::DoDataExchange(CDataExchange* pDX)
{ {
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_TALK, m_EditTalk); DDX_Control(pDX, IDC_EDIT_TALK, m_EditTalk);
m_EditTalk.SetLimitText(2048);
} }
@@ -63,15 +64,12 @@ void CTalkDlg::OnBnClickedButtonTalk()
CString strData; CString strData;
m_EditTalk.GetWindowText(strData); //EditBox <20>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_EditTalk.GetWindowText(strData); //EditBox <20>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* szBuffer = new char[iLength + 1]; // 2019.1.5 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 char szBuffer[4096] = {0};
memset(szBuffer,0,sizeof(char)*iLength);
strcpy(szBuffer,strData.GetBuffer(0)); strcpy(szBuffer,strData.GetBuffer(0));
m_EditTalk.SetWindowText(NULL); //EditBox <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_EditTalk.SetWindowText(NULL); //EditBox <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)szBuffer, strlen(szBuffer));//<2F><><EFBFBD>Լ<EFBFBD><D4BC>ڴ<EFBFBD><DAB4>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)szBuffer, strlen(szBuffer));//<2F><><EFBFBD>Լ<EFBFBD><D4BC>ڴ<EFBFBD><DAB4>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>
delete [] szBuffer;
} }