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

📄 clientthread.cpp

📁 一个关于下载文件客户程序的小程序
💻 CPP
字号:
// ClientThread.cpp : implementation file
//

#include "stdafx.h"
#include "CFileClient.h"
#include "ClientThread.h"

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

/////////////////////////////////////////////////////////////////////////////
// CClientThread

IMPLEMENT_DYNCREATE(CClientThread, CWinThread)

CClientThread::CClientThread()
{
	m_pClient = NULL;
	m_bDataReceived = TRUE;
}

CClientThread::~CClientThread()
{
}

BOOL CClientThread::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	m_nTimerID = SetTimer(NULL, 0, 4000, NULL);
	return TRUE;
}

int CClientThread::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	if(m_nTimerID != 0)
		KillTimer(NULL, m_nTimerID);

	if(m_pClient)
	{
		m_pClient->AttemptToDisconnect();
		delete m_pClient;
		m_pClient = NULL;
	}

	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CClientThread, CWinThread)
	//{{AFX_MSG_MAP(CClientThread)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		ON_THREAD_MESSAGE(WM_CLIENT_CMD, OnClientCmd)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CClientThread message handlers

BOOL CClientThread::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message == WM_TIMER && pMsg->wParam == m_nTimerID)
		ProcessTimer();

	return CWinThread::PreTranslateMessage(pMsg);
}

void CClientThread::ProcessTimer()
{
/*
	if(m_bDataReceived)
	{
		m_bDataReceived = FALSE;

		ASSERT(m_pClient);
		TRY
		{
			*m_pClient << (BYTE)TF_CHECKSERVER;
			m_pClient->Flush();
		}
		CATCH(CUserException, e)
		{
			e->Delete();
			ExitClientThread();
		}
		END_CATCH
	}
	else//连接超时,被强迫关闭
		ExitClientThread();
*/
}

void CClientThread::ExitClientThread()
{
/*
	PostQuitMessage(0);
	if(m_pClient && m_pClient->m_pParent)
		m_pClient->m_pParent->PostMessage(WM_CLIENT_CLOSE, 0, 0);
*/
}

void CClientThread::OnConnect()
{
	if(m_pClient == NULL)
	{
		VERIFY(m_pClient = new CClient);
		m_pClient->SetParent(m_pParentWnd);
	}

	if(m_pClient->m_hSocket != INVALID_SOCKET)
		m_pClient->AttemptToDisconnect();

	m_pClient->AttemptToConnect(m_strServerIP, 2000);
}

void CClientThread::OnDisconnect()
{
	ASSERT(m_pClient);
	if(m_pClient->m_hSocket != INVALID_SOCKET)
		m_pClient->AttemptToDisconnect();
}

void CClientThread::OnBrowse()
{
	ASSERT(m_pClient);
	ASSERT(m_pClient->m_hSocket != INVALID_SOCKET);

	m_pClient->RequestBrowse();
}

void CClientThread::OnDownload()
{
	if(m_pClient && m_pClient->m_hSocket != INVALID_SOCKET
		&& m_pClient->InitDownload())
			m_pClient->RequestDownloadNext();
}

void CClientThread::OnCancelDownload()
{
	if(m_pClient && m_pClient->m_hSocket != INVALID_SOCKET)
		m_pClient->CancelTransfer();
}

/*
void CClientThread::OnDataReady(UINT wParam, LONG lParam)
{
	m_bDataReceived = TRUE;

	ASSERT(m_pClient);
	TRY
	{
		m_pClient->ReceiveData();
	}
	CATCH(CUserException, e)
	{
		e->Delete();
		ExitClientThread();
	}
	END_CATCH
}
*/

void CClientThread::OnClientCmd(UINT wParam, LONG lParam)
{
	switch(wParam)
	{
	case CMD_CONNECT:
		OnConnect();
		break;

	case CMD_DISCONNECT:
		OnDisconnect();
		break;

	case CMD_BROWSE:
		OnBrowse();
		break;

	case CMD_DOWNLOAD:
		OnDownload();
		break;

	case CMD_CANCELDOWNLOAD:
		OnCancelDownload();
		break;

	case CMD_TERMINATE:
		OnTerminate();
		break;

	default:
		break;
	}
}

void CClientThread::OnTerminate()
{
	if(m_pClient)
	{
		m_pClient->CloseSocket();
		delete m_pClient;
		m_pClient = NULL;
	}
	
	PostQuitMessage(0);
}

⌨️ 快捷键说明

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