Prechádzať zdrojové kódy

fixed bugs for: null ptr, sync-time-lock, destructor, wait-thread-when-exit

lihz 8 rokov pred
rodič
commit
feb80aff8a
7 zmenil súbory, kde vykonal 90 pridanie a 119 odobranie
  1. 1 1
      QueueStrManager.cpp
  2. 11 14
      SyncTime/SyncManager.cpp
  3. 1 1
      SyncTime/SyncManager.h
  4. 57 44
      YAServerDlg.cpp
  5. 19 54
      classdef.cpp
  6. 0 5
      classdef.h
  7. 1 0
      log_def.h

+ 1 - 1
QueueStrManager.cpp

@@ -62,7 +62,7 @@ void QueueStrManager::Execute()
 		}
 		try
 		{
-			char* pchr = new char[m_length];
+			char* pchr = new char[m_length + 2]; // Ô¤Áô½áÊø·û
 			strcpy(pchr, m_chr);
 			QueueUserWorkItem(m_pfunc, (LPVOID)pchr, WT_EXECUTEDEFAULT);
 		}

+ 11 - 14
SyncTime/SyncManager.cpp

@@ -11,7 +11,7 @@ HostServer::SyncManager::SyncManager()
 void HostServer::SyncManager::init()
 {
 	InitializeCriticalSection(&m_csSyncTime);
-	InitializeCriticalSection(&m_csCalcLiner);
+	//InitializeCriticalSection(&m_csCalcLiner);
     _anchors.swap(unordered_map<unsigned long long, Position>());
 	//_syncTimeMsgs.clear();
 	//_historySync.clear();
@@ -161,7 +161,8 @@ HostServer::Position HostServer::SyncManager::analyzeTagMsg(TagMsg &tagMsg, unsi
 
 unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
 {
-	EnterCriticalSection(&m_csCalcLiner);
+	//EnterCriticalSection(&m_csCalcLiner);
+	EnterCriticalSection(&m_csSyncTime);
     // 获取历史记录中与此tag最近的两条
     deque<SyncTime> hisSync;
     //ofstream fout("test/linar_513.txt",ios::app);
@@ -171,7 +172,8 @@ unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
 		unordered_map<unsigned long long, SyncTimeMsg>::iterator it = _syncTimeMsgs[idx].SyncTimeMsgs.find(tag.StationIdCode);
 		if(it != _syncTimeMsgs[idx].SyncTimeMsgs.end()){
 			if(it->second.SyncLevel() == 0){
-				LeaveCriticalSection(&m_csCalcLiner);
+				//LeaveCriticalSection(&m_csCalcLiner);
+				LeaveCriticalSection(&m_csSyncTime);
 				return tag.ReceiveTime;
 			}
 		}
@@ -197,21 +199,17 @@ unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
     }
     // 如果满足条件的历史记录不足两个则返回
     if(hisSync.size() < 2){
-		LeaveCriticalSection(&m_csCalcLiner);
+		//LeaveCriticalSection(&m_csCalcLiner);
+		LeaveCriticalSection(&m_csSyncTime);
 		return LLONG_MAX;
 	}
 
-	/*unsigned long long root_sync_time = 0;
-
-	for(deque<SyncTime>::iterator it = hisSync.begin();it!=hisSync.end();++it){
-		if(it->SyncLevel == 0){
-			root_sync_time = it->SendTime;
-		}
-	}*/
-
     // 计算预估值
     long long y1(hisSync.at(0).ReceiveTime() - hisSync.at(0).TimeDelay()),y2(hisSync.at(1).ReceiveTime() - hisSync.at(1).TimeDelay());
     long long x1(hisSync.at(0).RealReceiveTime()), x2(hisSync.at(1).RealReceiveTime()), x3(tag.ReceiveTime);
+
+	LeaveCriticalSection(&m_csSyncTime);
+
     unsigned long long res;
     if(x1 > x2)
     {
@@ -247,7 +245,6 @@ unsigned long long HostServer::SyncManager::calTimeByLinar(TagMsg &tag)
     res = X(2);
     res &= TIME_MAX;
 
-	LeaveCriticalSection(&m_csCalcLiner);
     return res;
 }
 
@@ -310,7 +307,7 @@ void HostServer::SyncManager::deleteAnchor(unsigned int localId, unsigned char l
 
 HostServer::SyncManager::~SyncManager()
 {
-	DeleteCriticalSection(&m_csCalcLiner);
+	//DeleteCriticalSection(&m_csCalcLiner);
 	DeleteCriticalSection(&m_csSyncTime);
 }
 

+ 1 - 1
SyncTime/SyncManager.h

@@ -27,7 +27,7 @@ namespace HostServer{
 		};
 
 		CRITICAL_SECTION m_csSyncTime;
-		CRITICAL_SECTION m_csCalcLiner;
+		//CRITICAL_SECTION m_csCalcLiner;
 
     public:
         SyncManager();

+ 57 - 44
YAServerDlg.cpp

@@ -184,6 +184,7 @@ ULONGLONG time_clear_call_time;
 ULONGLONG time_send_call;
 ULONGLONG time_send_help;
 ULONGLONG time_ws_connect;
+volatile LONG g_QueueItemCount = 0;
 bool g_exit=false;
 long giSqlCount=0;
 long giSqlThreadCount=0;
@@ -194,40 +195,36 @@ HANDLE hSemaHandle=NULL;
 
 DWORD WINAPI _exec_sql(LPVOID lparam)
 {
+	::InterlockedIncrement(&g_QueueItemCount);
 	char *sql = (char*)lparam ;
 	CMysqlConn* pConn = NULL;
 	CDBConnGuard pDbGuard(pConn);
 	if(pConn == NULL){
-		delete[] sql;
-		sql = NULL;
+		if(sql){
+			delete[] sql;
+			sql = NULL;
+		}
+		::InterlockedDecrement(&g_QueueItemCount);
 		return 1;
 	}
-	//MYSQL_RES* pRes;
 	int err = 0;
-	//pRes = pConn->Execute(sql, err);
-	//mysql_free_result(pRes);
-
 	pConn->MultiExecute(sql,err);
 
 	if(err > 0){
 		TRACE(_T("sql error \n"));
 	}
-
-	/*ofstream out("SQL_S.log",ios::out | ios::app);
-	if (out.is_open())
-	{
-	out<<sql;
-	out<<err;
-	out.close();
-	}*/
-	delete[] sql;
-	sql = NULL;
+	if(sql){
+		delete[] sql;
+		sql = NULL;
+	}
 	Sleep(1);
+	::InterlockedDecrement(&g_QueueItemCount);
 	return 0;
 }
 
 DWORD WINAPI _write_error_log(LPVOID lparam)
 {
+	::InterlockedIncrement(&g_QueueItemCount);
 	LogInfo* err =  (LogInfo*)lparam;
 	CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(err->handle);
 	dlg->writeErrorLogEx(err->path, err->strLog, err->useTime);
@@ -243,12 +240,13 @@ DWORD WINAPI _write_error_log(LPVOID lparam)
 		err = NULL;
 	}
 	Sleep(1);
-
+	::InterlockedDecrement(&g_QueueItemCount);
 	return 0;
 }
 
 DWORD WINAPI _parse_package_data(LPVOID lparam)
 {
+	::InterlockedIncrement(&g_QueueItemCount);
 	ParseData* data =  (ParseData*)lparam;
 	CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(data->handle);
 	dlg->parse_package_data(data->buf, data->len, data->dwConnID);
@@ -256,11 +254,13 @@ DWORD WINAPI _parse_package_data(LPVOID lparam)
 
 	free(data);
 	Sleep(1);
+	::InterlockedDecrement(&g_QueueItemCount);
 	return 0;
 }
 
 DWORD WINAPI _parse_data_server(LPVOID lparam)
 {
+	::InterlockedIncrement(&g_QueueItemCount);
 	//TRACE(_T("in thread \n"));
 	ParseData* data =  (ParseData*)lparam;
 	CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(data->handle);
@@ -271,6 +271,7 @@ DWORD WINAPI _parse_data_server(LPVOID lparam)
 	//TRACE(_T("use data over %d = \n"),data->handle->m_nMallocTimes);
 	free(data);
 	Sleep(1);
+	::InterlockedDecrement(&g_QueueItemCount);
 	return 0;
 }
 
@@ -643,10 +644,7 @@ void CYAServerDlg::stop_and_exit()
 	if(is_websocket_login){
 		ws_logout();
 	}
-
-	::SetMainWnd(NULL);
-	::SetInfoList(NULL);
-
+	
 	g_exit = true;
 	if(m_thread_monitor){
 		WaitForSingleObject(m_thread_monitor->m_hThread, 0);
@@ -657,11 +655,21 @@ void CYAServerDlg::stop_and_exit()
 	}
 	m_thread_timer = NULL;
 
-	clear_all_list();
-
 	if(m_qsmSQL){
 		m_qsmSQL->Execute();
 	}
+
+	CString strlog;
+	while(g_QueueItemCount >0){
+		strlog.Format(_T("%s: %d"), _T(LOG_LEFT_THREAD), g_QueueItemCount);
+		show_log(strlog);
+		WaitForMS(3000);
+	}
+	
+	::SetMainWnd(NULL);
+	::SetInfoList(NULL);
+
+	clear_all_list();
 	GetConnPool().CloseAllConn();
 
 	DeleteCriticalSection(&m_csWriteLog);
@@ -2402,6 +2410,9 @@ void CYAServerDlg::parse_data_adhoc( BYTE* DataBuffer, int& nCurPos, int reader_
 
 void CYAServerDlg::add_socket_to_list(DWORD dwConnID, DWORD reader_id )
 {
+	if(m_enState != ST_STARTED){
+		return;
+	}
 	TCHAR szAddress[40];
 	int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
 	USHORT usPort;
@@ -6748,18 +6759,18 @@ void CYAServerDlg::release_map_memory()
 
 void CYAServerDlg::release_card_memory()
 {
-	if(mp_card_list_all.size()>0){
-		CardMap::iterator it = mp_card_list_all.begin();
-		for(;it!=mp_card_list_all.end();){
-			Card* tmp = (Card*)(it->second);
-			mp_card_list_all.erase(it);
-			if(tmp){
-				delete tmp;
-				tmp = NULL;
-			}
-			it = mp_card_list_all.begin();
-		}
-	}
+	//if(mp_card_list_all.size()>0){
+	//	CardMap::iterator it = mp_card_list_all.begin();
+	//	for(;it!=mp_card_list_all.end();){
+	//		Card* tmp = (Card*)(it->second);
+	//		mp_card_list_all.erase(it);
+	//		if(tmp){
+	//			delete tmp;
+	//			tmp = NULL;
+	//		}
+	//		it = mp_card_list_all.begin();
+	//	}
+	//}
 }
 
 void CYAServerDlg::release_reader_memory()
@@ -6952,15 +6963,17 @@ void CYAServerDlg::parse_data_server( const BYTE * pData, int nLen, DWORD dwConn
 			it->second->wReadLen += nLen - read_length;
 		}else{
 			_SOCKET_BUFFER* _sockbuf = (_SOCKET_BUFFER*)malloc(sizeof(_SOCKET_BUFFER));
-			_sockbuf->wReadLen = 0;
-			_sockbuf->dwConnID = dwConnId;
-			_sockbuf->wLen = pkg_len;
-			memset(_sockbuf->pData, 0, LENGTH_MSG_1M);
-			//TRACE("5\n");
-			//TRACE(_T("13_2  new socket_buffer\n"));
-			memcpy(_sockbuf->pData, &Buf[read_length], nLen - read_length);
-			_sockbuf->wReadLen += nLen - read_length;
-			mp_socket_buffer_list.insert(make_pair(dwConnId, _sockbuf));
+			if(_sockbuf){
+				_sockbuf->wReadLen = 0;
+				_sockbuf->dwConnID = dwConnId;
+				_sockbuf->wLen = pkg_len;
+				memset(_sockbuf->pData, 0, LENGTH_MSG_1M);
+				//TRACE("5\n");
+				//TRACE(_T("13_2  new socket_buffer\n"));
+				memcpy(_sockbuf->pData, &Buf[read_length], nLen - read_length);
+				_sockbuf->wReadLen += nLen - read_length;
+				mp_socket_buffer_list.insert(make_pair(dwConnId, _sockbuf));
+			}
 		}
 	}
 	delete[] Buf;

+ 19 - 54
classdef.cpp

@@ -60,8 +60,7 @@ Card::Card( string cardid, int cardtype, double z_offset, double offset_x /*= 12
 		p_dists[i] = NULL;
 		p_dists_locate[i] = NULL;
 	}
-	cal_location3 = new CalLocation3(KALMAN_OFFSET_COOR_TRI, KALMAN_OFFSET_MOVE_TRI, KALMAN_OFFSET_RANGING_TRI, KALMAN_INTERVAL_TRI);
-	p3_anchors = new Point3[ANCHOR_COUNT];
+
 	is_deal_by_algo = false;
 	pReaderPathMap = NULL;
 	pTdoaReaderPathMap = NULL;
@@ -1011,11 +1010,11 @@ Card::~Card(void)
 		m_pKalmanFilter = NULL;
 	}
 
-	for(int i = 0;i<DIST_COUNT;i++){
-		delete p_dists[i];
-		p_dists[i] = NULL;
-		delete p_dists_locate[i];
-		p_dists_locate[i] = NULL;
+	for(int i = DIST_COUNT - 1;i >= 0;i--){
+		if(p_dists[i] != NULL){
+			delete p_dists[i];
+			p_dists[i] = NULL;
+		}
 	}
 	
 	if(p_dists){
@@ -1023,19 +1022,21 @@ Card::~Card(void)
 		p_dists = NULL;
 	}
 
-	if(p_dists_locate){
-		delete[] p_dists_locate;
-		p_dists_locate = NULL;
-	}
-
-	if(p3_anchors){
-		delete[] p3_anchors;
-		p3_anchors = NULL;
+	if(init_postion){
+		for(int i = DIST_COUNT - 1;i >= 0;i--){
+			if(p_dists_locate[i] != NULL){
+				delete p_dists_locate[i];
+				p_dists_locate[i] = NULL;
+			}
+		}
+		if(p_dists_locate){
+			delete[] p_dists_locate;
+			p_dists_locate = NULL;
+		}
 	}
 
-	if(cal_location3){
-		delete cal_location3;
-	}
+	//_dists.swap(DistQueMap());
+	_dists.clear();
 
 	DeleteCriticalSection(&m_csCard);
 }
@@ -1080,31 +1081,6 @@ void Card::get_coordinate_2d( int cnt )
 	//z1 = 0;
 }
 
-void Card::get_coordinate_3d( int cnt )
-{
-	double d_dist[ANCHOR_COUNT];
-	Point3 pt3, pt3_1;
-	for(int i = 0; i < cnt; i++){
-		d_dist[i] = p_dists_locate[i]->d;
-	}
-
-	Mat mat(ANCHOR_COUNT, 1, d_dist);
-	if(is_anchor_changed){
-		set_anchors(cnt);
-		pt3 = cal_location3->initPos(mat);
-	} else{
-		pt3 = cal_location3->estiPos(mat);
-	}
-	pt3_1 = cal_location3->getError();
-
-	x = pt3.x;
-	y = pt3.y;
-	z = pt3.z;
-	x1 = pt3_1.x;
-	y1 = pt3_1.y;
-	z1 = pt3_1.z;
-}
-
 double Card::get_speed()
 {
 	double speed = 0; 
@@ -1112,17 +1088,6 @@ double Card::get_speed()
 	return speed;
 }
 
-void Card::set_anchors( int cnt )
-{
-	for(int i = 0; i < cnt; i++){
-		p3_anchors[i].x = p_dists[i]->x;
-		p3_anchors[i].y = p_dists[i]->y;
-		p3_anchors[i].z = p_dists[i]->z;
-	}
-	cal_location3->setAnchors(p3_anchors, ANCHOR_COUNT);
-	is_anchor_changed = false;
-}
-
 /*
  * 采用TOF或者TDOA算法进行定位计算
  *

+ 0 - 5
classdef.h

@@ -762,11 +762,6 @@ public:
 	void algo_tdoa(int cnt);
 public:
 	// 滤波算法相关
-	//CalLocation* cal_location;
-	CalLocation3* cal_location3;
-	//Point2* p2_anchors;
-	Point3* p3_anchors;
-	//bool is_init_kalman;
 	CKalmanFilter* m_pKalmanFilter;
 	//int m_max_stamp; // 最大的时间戳,即最近采集的数据
 	list<sync_data> m_syncNumList;

+ 1 - 0
log_def.h

@@ -41,6 +41,7 @@
 #define LOG_LISTEN_START "启动监听服务"
 #define LOG_LISTEN_FAIL "启动监听服务失败"
 #define LOG_LISTEN_STOP "停止监听服务"
+#define LOG_LEFT_THREAD "剩余线程数量"
 
 #define LOG_SUCCESS "成功"
 #define LOG_FAIL "失败"