Explorar o código

线程中关于m_strbuffer存在Bug,如果不及时清理会越来越大。

sat23 %!s(int64=4) %!d(string=hai) anos
pai
achega
c6a25835fc

+ 3 - 2
SerialWatch/SerialWatch/SerialWatch.cpp

@@ -40,9 +40,10 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 			StartMonitor();
 
 			//RTK_USBUpgrade(0x1B); // ESC¼üÉý¼¶;
-			RTK_USBUpgrade(0x09); // TAB¼üÉý¼¶;
+			//RTK_USBUpgrade(0x09); // TAB¼üÉý¼¶;
 
-			Sleep(30000);
+			//Sleep(30000);
+			system("pause");
 			CloseTVPort();
 		}
 	}

+ 35 - 4
SerialWatch/SerialWatch/SynSerial.cpp

@@ -1,6 +1,8 @@
 #include "StdAfx.h"
 #include "SynSerial.h"
 
+int CSynSerial::s_nCurPos = 0;
+byte CSynSerial::s_byBuffer[BUFFER_LEN];
 ThreadSection CSynSerial::s_csClearBuffer;
 CSynSerial::CSynSerial(void) :m_hSerialPort(NULL)
 , m_dwInQueue(1024)
@@ -284,7 +286,7 @@ bool CSynSerial::WriteComm(IN BYTE * pWirteBuf, IN CONST INT32 nWriteSize)
 		DWORD dwError = GetLastError();
 		if ( ERROR_IO_PENDING == GetLastError() ) {
 			while(!GetOverlappedResult(m_hSerialPort, &m_writeOverlapped, &dwBytesWritten, FALSE)){
-#ifdef _DEBUG
+#if 0
 				printf("\t\t写串口出错: %d,%d,%d,%d,%d,%d\n", 
 					GetLastError(), m_writeOverlapped.Internal, m_writeOverlapped.InternalHigh,
 					m_writeOverlapped.Offset, m_writeOverlapped.OffsetHigh,dwBytesWritten);
@@ -320,13 +322,13 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
 		PurgeComm(m_hSerialPort, PURGE_TXABORT|PURGE_TXCLEAR);
 	}
  
-	int i = 0;
-	TCHAR szLog[MAX_PATH] ;
 	if ( !ReadFile(m_hSerialPort, pReadBuf, dwReadSize, &dwRealRead, &m_readOverlapped) ) {
 		if ( STATUS_PENDING == m_readOverlapped.Internal ) {
 			while(!GetOverlappedResult(m_hSerialPort, &m_readOverlapped, &dwRealRead, FALSE)){
 
-#ifdef _DEBUG
+#if 0
+				static int i = 0;
+				static TCHAR szLog[MAX_PATH] ;
 				Sleep(20);
 				_stprintf_s(szLog,"\t\t读串口出错: %d = %d,%d,%d,%d,%d,%d\n", ++i,
 					GetLastError(), m_readOverlapped.Internal, m_readOverlapped.InternalHigh,
@@ -387,15 +389,44 @@ void CSynSerial::EndofThread()
 
 DWORD CSynSerial::ThreadWatch(LPVOID lpVoid)
 {
+	int nLeft = 0;
+	bool bFist = true;	// 是否填充完整过;
 	DWORD dwRealRead;
 	TCHAR szValue[1024] = {0};
 	CSynSerial *pthat = (CSynSerial*)lpVoid;
 	
 	do 
 	{
+		memset(szValue, 0, 1024);
 		if ( (dwRealRead = pthat->ReadComm((BYTE*)szValue, 1024)) > 0) {
 			AutoThreadSection aSection(&s_csClearBuffer);
+			OutputDebugString(_T("内容:"));
+			OutputDebugString(szValue);
+			OutputDebugString(_T("\n"));
+
+#if 1
+			if ( (s_nCurPos + dwRealRead) > BUFFER_LEN ) {
+				// 先复制尾部;
+				nLeft = dwRealRead - (BUFFER_LEN-s_nCurPos);
+				memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, BUFFER_LEN-s_nCurPos);
+				s_nCurPos = 0;
+				memcpy_s(s_byBuffer, nLeft, &szValue[nLeft], nLeft);
+				s_nCurPos = nLeft;
+				bFist = false;
+			} else {
+				memcpy_s(&s_byBuffer[s_nCurPos], BUFFER_LEN-s_nCurPos, szValue, dwRealRead);
+				s_nCurPos += dwRealRead;
+			}
+
+			pthat->m_strbuffer.clear();
+			if ( !bFist )
+				pthat->m_strbuffer.append((char*)&s_byBuffer[s_nCurPos], BUFFER_LEN - s_nCurPos);
+			pthat->m_strbuffer.append((char*)s_byBuffer, s_nCurPos);
+
+			printf("内容:%s\n", pthat->m_strbuffer.c_str());
+#else // 这里如果不及时清除,内存越来越大;
 			pthat->m_strbuffer.append(szValue, dwRealRead);
+#endif
 #ifdef _DEBUG
 			printf(_T("buffer=%s\n"), pthat->m_strbuffer.c_str());
 #endif

+ 6 - 0
SerialWatch/SerialWatch/SynSerial.h

@@ -19,6 +19,8 @@
 #ifndef __SYN_SERIAL__
 #define __SYN_SERIAL__
 
+#define BUFFER_LEN 1000/*8912*/
+
 #include "CritSection.h"
 
 #pragma once
@@ -44,6 +46,10 @@ private:
 	// Êä³ö»º´æ´óС(byte);
 	DWORD	m_dwOutQueue;
 	std::string m_strbuffer;
+
+	// µ±Ç°½Úµã;
+	static int s_nCurPos;
+	static byte s_byBuffer[BUFFER_LEN];
 	static ThreadSection s_csClearBuffer;
 public:
 	inline BOOL IsOpen() const {