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

📄 progressdialog.cpp

📁 iocp vc例子,自己是学DELPHI
💻 CPP
字号:
// ProgressDialog.cpp : implementation file
//

#include "stdafx.h"
#include "ZNetServer.h"
#include "ProgressDialog.h"
#include "ZNetServerDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CProgressDialog dialog


CProgressDialog::CProgressDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CProgressDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CProgressDialog)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CProgressDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProgressDialog)
	DDX_Control(pDX, IDC_LIST_PACKET, m_lcPacket);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CProgressDialog, CDialog)
	//{{AFX_MSG_MAP(CProgressDialog)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProgressDialog message handlers

void CProgressDialog::OnOK() 
{
	// TODO: Add extra validation here
	ShowWindow(SW_HIDE);
	CDialog::OnOK();
}

BOOL CProgressDialog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_lcPacket.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_lcPacket.InsertColumn(0, _T("socket"), LVCFMT_LEFT, 50);
	m_lcPacket.InsertColumn(1, _T("key"), LVCFMT_LEFT, 50);	
	m_lcPacket.InsertColumn(2, _T("flag"), LVCFMT_LEFT, 50);
	m_lcPacket.InsertColumn(3, _T("progress"), LVCFMT_LEFT, 100);
	m_lcPacket.InsertColumn(4, _T("desc"), LVCFMT_LEFT, 200);
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


int CProgressDialog::FindPacketItem(SOCKET soSocket, ULONG ulKey)
{
	int nRet=-1;
	CString strSocket, strKey;
	strSocket.Format(_T("%d"), soSocket);
	strKey.Format(_T("%d"), ulKey);
	for (int i=0; i<m_lcPacket.GetItemCount(); i++)
	{
		if (strSocket.CompareNoCase(m_lcPacket.GetItemText(i, 0))==0 && 
			strKey.CompareNoCase(m_lcPacket.GetItemText(i, 1))==0)
		{
			nRet = i;
			break;
		}
	}
	return nRet;
}

void CProgressDialog::ProcessPacketBegin(SOCKET soSocket, CIocpPacket* pPacket)
{
	if (soSocket==INVALID_SOCKET || pPacket==NULL) return;

	LoggingX(_T("Enter ProcessPacketBegin"));
	int i=FindPacketItem(soSocket, pPacket->m_ulKey);
	if (i<0)
	{
		CString strSocket, strKey;
		strSocket.Format(_T("%d"), soSocket);
		strKey.Format(_T("%d"), pPacket->m_ulKey);
		CString strFlag=(pPacket->m_wType==PACKETTYPE_WRITE)?_T("send"):_T("recv");
		i = m_lcPacket.InsertItem(m_lcPacket.GetItemCount(), _T(""));
		m_lcPacket.SetItemText(i, 0, strSocket);
		m_lcPacket.SetItemText(i, 1, strKey);
		m_lcPacket.SetItemText(i, 2, strFlag);
		m_lcPacket.SetItemText(i, 3, _T("0%"));		

		if (pPacket->m_wType==PACKETTYPE_WRITE)
		{		
			CString strTest1, strTest2;
			CIocpPacketHeader& pkHeader=pPacket->GetPacketHeader();
			CArchive ar(&pPacket->GetPacketMem(), CArchive::load|CArchive::bNoFlushOnDelete);
			ar >> strTest1;
			ar >> strTest2;
			ar.Close();
			CString strFileList;
			for (int j=0; j<pPacket->GetPacketFileCount(); j++)
			{				
				CString strFileName;
				pPacket->GetPacketFile(j, strFileName);
				strFileList += strFileName + _T(";");
			}
			CString strData;
			strData.Format(_T("cmd: %d, wparam: %d, lparam: %d, %s, %s, ""%s"""), 
				pkHeader.m_nCmd, pkHeader.m_wParam, pkHeader.m_lParam, 
				strTest1, strTest2, strFileList);
			CString strSendData=_T("senddata - ")+strData;
			Logging4(ERRORLEVEL_INFO, strSendData, DOMAIN_NAME, CLASS_NAME_ZNETSERVERDLG);		
			
			m_lcPacket.SetItemText(i, 4, strSendData);
		}
	}
	LoggingX(_T("Leave ProcessPacketBegin"));
}

void CProgressDialog::ProcessPacketProgress(SOCKET soSocket, ULONG ulKey, WPARAM wParam, LPARAM lParam)
{
	LoggingX(_T("Enter ProcessPacketProgress"));
	int i=FindPacketItem(soSocket, ulKey);
	if (i<0) 
	{
		LoggingX(_T("Leave ProcessPacketProgress"));
		return;
	}

	CString strProgress=m_lcPacket.GetItemText(i, 3);
	if (strProgress.CompareNoCase(_T("cancelled"))!=0)
	{	
		DOUBLE dProgress=(wParam>0)?((DOUBLE)lParam/(DOUBLE)wParam*100):0;
		DOUBLE dOldProgress=atof(strProgress);
		if (dProgress>dOldProgress)
		{
			strProgress.Format(_T("%d%%"), (int)dProgress);
			m_lcPacket.SetItemText(i, 3, strProgress);
		}
	}
	LoggingX(_T("Leave ProcessPacketProgress"));
}

void CProgressDialog::ProcessPacketEnd(SOCKET soSocket, CIocpPacket* pPacket)
{
	if (soSocket==INVALID_SOCKET || pPacket==NULL) return;

	int i=FindPacketItem(soSocket, pPacket->m_ulKey);
	if (i<0) return;

	LoggingX(_T("Enter ProcessPacketEnd"));

	m_lcPacket.SetItemText(i, 3, _T("100%"));
	if (m_lcPacket.GetItemText(i, 4).IsEmpty())
	{
		CString strTest1, strTest2;
		CIocpPacketHeader& pkHeader=pPacket->GetPacketHeader();
		CArchive ar(&pPacket->GetPacketMem(), CArchive::load|CArchive::bNoFlushOnDelete);
		ar >> strTest1;
		ar >> strTest2;
		ar.Close();		
		CString strFileList;
		for (int j=0; j<pPacket->GetPacketFileCount(); j++)
		{				
			CString strFileName;
			pPacket->GetPacketFile(j, strFileName);
			strFileList += strFileName + _T(";");
		}
		CString strData;
		strData.Format(_T("cmd: %d, wparam: %d, lparam: %d, %s, %s, ""%s"""), 
			pkHeader.m_nCmd, pkHeader.m_wParam, pkHeader.m_lParam, 
			strTest1, strTest2, strFileList);		
		CString strRecvData=_T("recvdata - ")+strData;
		m_lcPacket.SetItemText(i, 4, strRecvData);
		Logging4(ERRORLEVEL_INFO, strRecvData, DOMAIN_NAME, CLASS_NAME_ZNETSERVERDLG);	
	}
	LoggingX(_T("Leave ProcessPacketEnd"));
}

void CProgressDialog::ProcessPacketCancel(SOCKET soSocket, ULONG ulKey)
{
	if (soSocket==INVALID_SOCKET) return;

	CString strSocket, strKey;
	strSocket.Format(_T("%d"), soSocket);
	strKey.Format(_T("%d"), ulKey);
	for (int i=0; i<m_lcPacket.GetItemCount(); i++)
	{
		if (strSocket.CompareNoCase(m_lcPacket.GetItemText(i, 0))!=0 || 
			m_lcPacket.GetItemText(i, 3).CompareNoCase(_T("100%"))==0)
			continue;
		
		if (ulKey>0)
		{
			if (strKey.CompareNoCase(m_lcPacket.GetItemText(i, 1))==0)
				m_lcPacket.SetItemText(i, 3, _T("cancelled"));	
		}
		else
		{
			m_lcPacket.SetItemText(i, 3, _T("cancelled"));
		}
	}
}

void CProgressDialog::OnButton1() 
{
	// TODO: Add your control notification handler code here
	m_lcPacket.DeleteAllItems();
}

void CProgressDialog::OnButton2() 
{
	// TODO: Add your control notification handler code here
	CZNetServerDlg* pDlg=(CZNetServerDlg*)AfxGetMainWnd();
	int i=m_lcPacket.GetNextItem(-1, LVNI_SELECTED);
	if (i>=0 && pDlg!=NULL)
	{
		int nSocket=atoi(m_lcPacket.GetItemText(i, 0));
		ULONG ulKey=atoi(m_lcPacket.GetItemText(i, 1));
		pDlg->m_IocpMngr.CancelSendData(nSocket, ulKey);
	}
}

⌨️ 快捷键说明

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