⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eachitemdoc.cpp

📁 一个多线程的网络数据采集系统(客户端)
💻 CPP
字号:
// EachItemDoc.cpp :  CEachItemDoc 类的实现
//

#include "stdafx.h"
#include "WspProcess.h"

#include "EachItemDoc.h"
#include "CurveView.h"

#include "ConnectDlg.h"
#include "ClientSocket.h"
#include "ClientThread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CEachItemDoc

IMPLEMENT_DYNCREATE(CEachItemDoc, CDocument)

BEGIN_MESSAGE_MAP(CEachItemDoc, CDocument)
	//{{AFX_MSG_MAP(CEachItemDoc)
	ON_COMMAND(ID_CONNECT, OnConnect)
	ON_UPDATE_COMMAND_UI(ID_CONNECT, OnUpdateConnectUI)
	ON_COMMAND(ID_SEND, OnSend)
	ON_UPDATE_COMMAND_UI(ID_SEND, OnUpdateSendUI)
	ON_COMMAND(ID_STOP, OnStopSend)
	ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStopSendUI)
	ON_COMMAND(ID_DISCONNECT, OnDisconnect)
	ON_UPDATE_COMMAND_UI(ID_DISCONNECT, OnUpdateDisconnectUI)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


// CEachItemDoc 构造/销毁

CEachItemDoc::CEachItemDoc()
{
	// TODO:在此添加一次性构造代码
    m_bConnected = FALSE;
	m_bData = FALSE;
//	m_pClientSocket = NULL;
	m_pClientThread = NULL;
//    m_dCommStatus = ;  //进行通信时,curveview的状态
	m_iComNo = 1;
	m_strServerIP = _T("127.0.0.1");
	m_DataType = TYPE_FLOAT;
}

CEachItemDoc::~CEachItemDoc()
{
	if(m_pClientThread)delete m_pClientThread;
}

BOOL CEachItemDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO:在此添加重新初始化代码
	// (SDI 文档将重用该文档)

	return TRUE;
}




// CEachItemDoc 序列化

void CEachItemDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO:在此添加存储代码
	}
	else
	{
		// TODO:在此添加加载代码
	}
}


// CEachItemDoc 诊断

#ifdef _DEBUG
void CEachItemDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CEachItemDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG


// CEachItemDoc 命令
void CEachItemDoc::SendOpenCom() 
{
	// TODO: Add your command handler code here
	CPkg *pkg = new CPkg();
	pkg->MsgFlag = ASKOPENCOM;
	pkg->datatype = m_DataType;
	pkg->uComNo = m_iComNo;
	m_sendQueue.Add(pkg);
	m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
  	m_dCommStatus = ASKOPENCOM;		
}

double CEachItemDoc::GetPkgValue(CPkg* pkg)
{
/*	double value;
	switch(pkg->datatype)
	{
	case TYPE_CHAR:
		value = (double)(pkg->data.d_char);
		break;
	case TYPE_INT:
		value = (double)(pkg->data.d_int);
		break;
	case TYPE_LONG:
		value = (double)(pkg->data.d_long);
		break;
	case TYPE_FLOAT:
		value = (double)(pkg->data.d_float);
		break;
	default:
		value = (double)(pkg->data.d_double);
		break;
	}
	return value;*/
	return (double)(pkg->data.d_float);
}

void CEachItemDoc::Receive(int i, CPkg* pkg)//SPLINEDATA pkg)
{
	int iPort =  pkg->uComNo;
			
	switch (pkg->MsgFlag) 
	{ 
		case ANSOPENCOM :	//回答已打开COM口	
			if(m_dCommStatus == ASKOPENCOM && iPort == m_iComNo)
			{	
				m_bConnected=TRUE;
				AfxMessageBox("Connected Success!please send data!");
				m_dCommStatus = CONN_COM;
			}		
			else
			{
				AfxMessageBox("收到的ANSOPENCOM报文与当前状态不配!");
			}
			break;
		case ANSCLOSECOM :	//回答已关闭COM口
			if (m_dCommStatus == ASKCLOSECOM && iPort == m_iComNo)
			{
				m_dCommStatus = NO_COM;	//状态改为未连接COM口状态
				m_bConnected = FALSE;
			//	delete m_pClientThread;
                m_pClientThread = NULL;
			//	delete m_pClientSocket;
			//	m_pClientSocket = NULL;
			}
			else
			{
				AfxMessageBox("收到的ANSCLOSECOM报文与当前状态不配!");
			}
			break;
		case ANSMODIFYCOM:	//回答已修改COM口设置
			if (m_dCommStatus == ASKMODIFYCOM && iPort == m_iComNo)
			{
			}
			else
			{
				AfxMessageBox("ANSMODIFYCOM error!");
			}
			break;
		case ANSPREPSEND:	//处于准备传送数据
			if (m_dCommStatus == ASKSEND)
			{
				m_dCommStatus = SENDDATA;	//状态改为传送数据状态
				m_bData=TRUE;				
			}
			else
			{
				AfxMessageBox("收到的ANSPREPSEND报文与当前状态不配!");
			}
			break;	
		case MESG:	//处于正常传送数据
			if (m_dCommStatus == SENDDATA || m_dCommStatus == ASKSTOP)
			{
				m_bData = TRUE;
				double tValue = GetPkgValue(pkg);
			/*	srand((unsigned)time( NULL ));
				int t1 = 50 + rand() % 37;
				static int t2 = 0;
				t2 = (t2 + 5) % 360;
				double theta = PiV * t2 / ConstV;
				m_graph.AddValue(i, (double)((t1 + 111 * (int)(sin(theta))) % 100 ));*/
				tValue = (int)tValue % 100;
				m_graph.AddValue(i, tValue);
				UpdateAllViews(NULL);				
            }
			else
			{
				CString temp;
				temp.Format("%u MESG error!",m_dCommStatus);
				AfxMessageBox(temp);
			}
			break;	
		case ANSSTOP:	//处于停止传送数据 
			if (m_dCommStatus == ASKSTOP)
			{		
				m_dCommStatus = PAUSE;
				m_bData = FALSE;
				AfxMessageBox("STOPSEND!");
				CRealTime *pGraph = &m_graph; 
				pGraph->EndRealDraw();
				POSITION pos = GetFirstViewPosition();
				CView* pView;
				while (pos != NULL)
				{
					pView = GetNextView(pos);
					if(pView->IsKindOf(RUNTIME_CLASS(CCurveView)))
						break;
				}
				CScrollBar *pXScrollBar = &(((CCurveView*)pView)->m_xScrollBar);
				CScrollBar *pYScrollBar = &(((CCurveView*)pView)->m_yScrollBar);
				int nMin, nMax;
				nMin = pGraph->m_nXTicks;
				nMax = pGraph->m_nPage * pGraph->m_nXTicks + pGraph->m_nTick;
				if(nMax > nMin)
				{
					pXScrollBar->SetScrollRange(nMin, nMax);
					pXScrollBar->SetScrollPos(nMax);
				}
				else
				{
					pXScrollBar->EnableWindow(FALSE);
				}
				pYScrollBar->EnableWindow(TRUE);
			}
			else
			{
				AfxMessageBox("STOPSEND error!");
			}
			break;
		default:
			break;
	}
}

void CEachItemDoc::SetComDataType(CString strDataType) 
{
	if (strDataType == _T("double"))
	{
		m_DataType = TYPE_DOUBLE;		
	}
	else if (strDataType == _T("char"))
	{
		m_DataType = TYPE_CHAR;
    }
	else if (strDataType == _T("int"))
	{
		m_DataType = TYPE_INT;
	}
	else if (strDataType == _T("float"))
	{
		m_DataType = TYPE_FLOAT;
	}
	else if (strDataType == _T("long"))
	{
		m_DataType = TYPE_LONG;
	}
}

void CEachItemDoc::OnConnect()
{
	if(m_pClientThread != NULL)
	{
		AfxMessageBox("数据端已连接!");
		return;
	}
	//建立一个CConnectDlg对话框,用于输入被请求的服务器的ip地址,COM口,数据类型
	CConnectDlg dlg;
	if(dlg.DoModal() != IDOK) return;		//如果输入未确认,则返回
	m_strServerIP = dlg.m_strIpAddress;		//保存地址
	m_iComNo = dlg.m_nComNo + 1;			//保存COM口号
	SetComDataType(dlg.m_strDataType);		//取出并保存输入的COM口的数据类型
				
	POSITION pos = GetFirstViewPosition();
	CView* pView;
	while (pos != NULL)
	{
		pView = GetNextView(pos);
		if(pView->IsKindOf(RUNTIME_CLASS(CCurveView)))break;
	}
	m_pClientThread = new CClientThread(&m_recvQueue, &m_sendQueue, pView, m_strServerIP);
	if(! m_pClientThread->CreateThread())
	{
		AfxMessageBox(_T("failing to Create Client Thread!"));
		delete m_pClientThread;
		m_pClientThread = NULL;
	}
//	m_pClientSocket->ListenEx(&m_queue, pView);
	SendOpenCom();							// 请求打开COM口
}

void CEachItemDoc::OnUpdateConnectUI(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(!m_bConnected);
}

//当按下“请求传送数据”键时,执行该函数
void CEachItemDoc::OnSend() 
{
	if( m_dCommStatus == CONN_COM)
	{	
		CPkg *pkg = new CPkg();
		pkg->MsgFlag = ASKSEND;
		pkg->datatype = m_DataType;
		pkg->uComNo = m_iComNo;
		m_sendQueue.Add(pkg);
		m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
		m_dCommStatus = ASKSEND;
		m_graph.RestoreRealDraw();
	}
}

void CEachItemDoc::OnUpdateSendUI(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bConnected && (!m_bData));
}

//当按下“请求暂停传送数据”键时,执行该函数,
void CEachItemDoc::OnStopSend() 
{
//	if( m_dCommStatus == SENDDATA)
	if(m_bData)
	{	
		CPkg *pkg = new CPkg();
		pkg->MsgFlag = ASKSTOP;
		pkg->datatype = m_DataType;
		pkg->uComNo = m_iComNo;
		m_sendQueue.Add(pkg);
		m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
		m_dCommStatus = ASKSTOP;
	}
}

void CEachItemDoc::OnUpdateStopSendUI(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bConnected && m_bData);	
}

/*
//当按下“请求关闭COM口”键时,执行该函数,
void CEachItemDoc::OnAskCloseCom() 
{
	if( m_dCommStatus != NO_COM)
	{	
		m_cPkg.MsgFlag = ASKCLOSECOM;
		m_pClientSocket->SendPkg(&m_cPkg);
		m_dCommStatus = ASKCLOSECOM;
	}
}*/

//当按下“请求断开与数据服务端的连接”键时,执行该函数,
void CEachItemDoc::OnDisconnect() 
{
	if(m_dCommStatus == CONN_COM || m_dCommStatus == PAUSE)
//	if(m_dCommStatus != NO_COM)
	{	
		CPkg *pkg = new CPkg();
		pkg->MsgFlag = ASKCLOSECOM;
		pkg->datatype = m_DataType;
		pkg->uComNo = m_iComNo;
		m_sendQueue.Add(pkg);
		m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
		m_dCommStatus = ASKCLOSECOM;
	}
}

void CEachItemDoc::OnUpdateDisconnectUI(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bConnected);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -