ADS-B&雷达显示终端——多源监视数据仿真平台5.2

相较于上一版本,此版本主要修改内容:

    1加入航迹数据记录与回放功能,采用SQLite数据库记录接收到的航迹数据,并支持数据回放。

    2支持部分SQLite数据库操作功能,包括数据删除、查询等;

   3支持虚拟列表功能;

回放效果:

ADS-B&雷达显示终端——多源监视数据仿真平台5.2_第1张图片


数据库管理界面:

ADS-B&雷达显示终端——多源监视数据仿真平台5.2_第2张图片


SQLite是一种开源的嵌入式数据,支持大部分SQL语法,最大可支持2TB数据容量,运行速度不错。SQLite完全开源,其源代码可以直接加入到VS工程中。其使用也十分方便,只需要掌握最基本的数据写入、查找即可。SQLite最大的缺点在于对网络访问、并行访问的支持不全面。因而不建立用于高并发访问场合,建议用于小型单机数据库建设。


在进行数据库查询时,因为记录的航迹数据量十分巨大,软件最大的速度瓶颈不在于数据库的访问和读取,而在于ListControl显示,在写入大量数据时ListControl会出现卡死现象,使用虚拟列表功能,可以在一定的程序上解决这个问题,当然并不能完全解决,在5万条数据以下,显示速度还可以接受,ListControl更新时不会出现长时间等待的情况。


虚拟列表功能是十分成熟的,网络上有现成的开源源代码。下面将源代码贴出来:


[cpp] view plain copy print ?
  1. // LabelItem.h: interface for the CLabelItem class. 
  2. // 
  3. ////////////////////////////////////////////////////////////////////// 
  4.  
  5. #if !defined(AFX_LABELITEM_H__AD63D692_F1DC_11D4_9414_00C04F68EB57__INCLUDED_) 
  6. #define AFX_LABELITEM_H__AD63D692_F1DC_11D4_9414_00C04F68EB57__INCLUDED_ 
  7.  
  8. #if _MSC_VER > 1000 
  9. #pragma once 
  10. #endif // _MSC_VER > 1000 
  11.  
  12. class CLabelItem : public CObject   
  13. public
  14.     CString m_strText[15]; 
  15.     CLabelItem(); 
  16.     CLabelItem(const CLabelItem& ci); 
  17.     const CLabelItem& operator=(const CLabelItem& stringSrc); 
  18.     virtual ~CLabelItem(); 
  19.  
  20. }; 
  21.  
  22. #endif //  
  23.  
  24.  
  25.  
  26. #include "stdafx.h" 
  27. #include "LabelItem.h" 
  28.  
  29. #ifdef _DEBUG 
  30. #undef THIS_FILE 
  31. static char THIS_FILE[]=__FILE__; 
  32. #define new DEBUG_NEW 
  33. #endif 
  34.  
  35. ////////////////////////////////////////////////////////////////////// 
  36. // Construction/Destruction 
  37. ////////////////////////////////////////////////////////////////////// 
  38.  
  39. CLabelItem::CLabelItem() 
  40.  
  41. CLabelItem::CLabelItem(const CLabelItem& ci) 
  42.     for(int i=0; i<15; i++) 
  43.         m_strText[i] = ci.m_strText[i]; 
  44.  
  45. CLabelItem::~CLabelItem() 
  46.  
  47. const CLabelItem& CLabelItem::operator=(const CLabelItem &ci) 
  48.     for(int i=0; i<15; i++) 
  49.         m_strText[i] = ci.m_strText[i]; 
  50.  
  51.     return *this
// LabelItem.h: interface for the CLabelItem class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_LABELITEM_H__AD63D692_F1DC_11D4_9414_00C04F68EB57__INCLUDED_)
#define AFX_LABELITEM_H__AD63D692_F1DC_11D4_9414_00C04F68EB57__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CLabelItem : public CObject  
{
public:
	CString m_strText[15];
	CLabelItem();
	CLabelItem(const CLabelItem& ci);
	const CLabelItem& operator=(const CLabelItem& stringSrc);
	virtual ~CLabelItem();

};

#endif // 



#include "stdafx.h"
#include "LabelItem.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLabelItem::CLabelItem()
{
}

CLabelItem::CLabelItem(const CLabelItem& ci)
{
	for(int i=0; i<15; i++)
		m_strText[i] = ci.m_strText[i];
}

CLabelItem::~CLabelItem()
{
}

const CLabelItem& CLabelItem::operator=(const CLabelItem &ci)
{
	for(int i=0; i<15; i++)
		m_strText[i] = ci.m_strText[i];

	return *this;
}

在VS工程中导入类文件后,还需要在使用ListControl类中加入一个队列CArray <CLabelItem, CLabelItem >m_arLabels;。

同时还需要给ListControl控件加入 ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST_DATA, GetDispInfo)消息,及消息响应函数

[cpp] view plain copy print ?
  1. void CDBmaintain::GetDispInfo(NMHDR* pNMHDR,LRESULT* pResult)  
  2.     LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 
  3.     LV_ITEM* pItem= &(pDispInfo)->item; 
  4.     CLabelItem rLabel = m_arLabels.ElementAt(pItem->iItem); 
  5.  
  6.     if (pItem->mask & LVIF_TEXT)  
  7.     { 
  8.         lstrcpy(pItem->pszText, 
  9.                 rLabel.m_strText[pItem->iSubItem]); 
  10.     } 
  11.  
  12.     *pResult = 0; 
void CDBmaintain::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	LV_ITEM* pItem= &(pDispInfo)->item;
	CLabelItem rLabel = m_arLabels.ElementAt(pItem->iItem);

	if (pItem->mask & LVIF_TEXT) 
	{
		lstrcpy(pItem->pszText,
				rLabel.m_strText[pItem->iSubItem]);
	}

	*pResult = 0;
}
之后,便可以直接给列表插入数据了:

[cpp] view plain copy print ?
  1. CLabelItem Label; 
  2.  
  3. //查询到总共记录个数 
  4. for(int i=0; i<nRow; i++) 
  5.     for(int j=0; j<nColum; j++) 
  6.     { 
  7.         Label.m_strText[j] = _T(“test”); 
  8.     } 
  9.     m_arLabels.SetAtGrow(i, Label); 

你可能感兴趣的:(ADS-B&雷达显示终端——多源监视数据仿真平台5.2)