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

📄 downloadcntl.cpp

📁 个人封装的一个VC++支持多任务、多线程断点续传的DLL组件
💻 CPP
字号:
// DownloadCntl.cpp: implementation of the CDownloadCntl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "iLeadDownloader.h"
#include "DownloadCntl.h"

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

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

CDownloadCntl::CDownloadCntl()
{
	/* 生成头结点 create head node */
	m_pHead = (NODE *)new NODE; 
	m_pHead->info = (void*)new int;
	*(int*)m_pHead->info = 0;
	m_pHead->link = NULL;

	m_pCurDownloadMTR = NULL;
	m_nCurDownloadMTRPos = 0;
}

CDownloadCntl::~CDownloadCntl()
{
	/* 删除头结点 delete head node */
	if( m_pHead )
	{
		delete m_pHead->info;
		m_pHead->info = NULL;

		delete m_pHead;
		m_pHead = NULL;
	}
}

int CDownloadCntl::GetTaskNum()
{
	return *(int*)m_pHead->info;
}

int CDownloadCntl::AddTask( char *pszUrl, char *pszSavePath, char *pszSaveFileName, int nThreadNum )
{
	m_csCntl.Lock();

	int nPos = 1;   // 新加入的任务在链表中的位置

	m_pCurDownloadMTR = new CDownloadMTR;
	m_pCurDownloadMTR->SetThreadCount( nThreadNum );

	// 构造一个新结点
	NODE *pNew = new NODE;
	pNew->info = (void*)m_pCurDownloadMTR;
	pNew->link = NULL;
	
	// 找到最后的位置,插入结点
	NODE *loop = m_pHead;
	while(loop->link)
	{
		loop = loop->link;
		nPos++;
	}
	loop->link = pNew;

	// 结点数增加
	(*(int*)m_pHead->info)++;

	// 开始下载
	int ret = m_pCurDownloadMTR->Download( pszUrl, pszSavePath, pszSaveFileName );
	
	m_nCurDownloadMTRPos = nPos;

	m_csCntl.Unlock();

	return nPos;
}

int CDownloadCntl::SelTask( int nPos )
{
	if( nPos < 1 || nPos > GetTaskNum() )
		return -1;  // 选择的任务超出范围

	m_csCntl.Lock();

	if( m_nCurDownloadMTRPos != nPos )
	{
		m_nCurDownloadMTRPos = nPos;

		NODE *loop = m_pHead;
		for( int i = 0; i < m_nCurDownloadMTRPos; i++ )
			loop = loop->link;
		
		m_pCurDownloadMTR = (CDownloadMTR*)loop->info;
	}

	m_csCntl.Unlock();

	return 0;
}

// 返回新指向的任务位置
int CDownloadCntl::RemoveTask()
{
	if( 0 == m_nCurDownloadMTRPos )
		return -1;

	m_csCntl.Lock();

	NODE *loop = m_pHead;
	for( int i = 1; i < m_nCurDownloadMTRPos; i++ )
		loop = loop->link;

	ASSERT( (CDownloadMTR*)loop->link->info == m_pCurDownloadMTR );

	// 停止任务并且销毁
	m_pCurDownloadMTR = (CDownloadMTR*)loop->link->info;
	m_pCurDownloadMTR->StopDownload();
	delete m_pCurDownloadMTR;
	
	// 处理链表
	NODE *p = loop->link;
	loop->link = loop->link->link;
	delete p;

	// 调整当前指向的任务,优先级是[后一个任务,前一个任务]
	if( 1 == *(int*)m_pHead->info )  // 如果删除的是最后一个任务
	{
		*(int*)m_pHead->info = 0;
		m_nCurDownloadMTRPos = 0;
		m_pCurDownloadMTR = NULL;
	}
	else
	{
		if( loop->link )  // 存在后一个任务
			m_pCurDownloadMTR = (CDownloadMTR*)loop->link->info;
		else
		{
			m_pCurDownloadMTR = (CDownloadMTR*)loop->info;
			m_nCurDownloadMTRPos--;
		}

		(*(int*)m_pHead->info)--;
	} // End of if( 1 == *(int*)m_pHead->info )

	m_csCntl.Unlock();

	return m_nCurDownloadMTRPos;
}

int CDownloadCntl::QueryState( int nPos, 
							   int &nFileTotaleSize, 
							   int &nTotalDownloadedSize,
							   int &nTotalDownloadedSize_ThisTimes,
							   int &nDownloadElapsedTime )
{
	if( nPos < 1 || nPos > GetTaskNum() )
		return -1;  // 选择的任务超出范围

	m_csCntl.Lock();

	NODE *loop = m_pHead;
	for( int i = 0; i < nPos; i++ )
		loop = loop->link;

	CDownloadMTR *tmp = (CDownloadMTR*)loop->info;
	nDownloadElapsedTime = tmp->GetDownloadElapsedTime();
	nFileTotaleSize = tmp->Get_FileTotaleSize();
	if( nFileTotaleSize > 0 )
	{
		nTotalDownloadedSize = tmp->Get_TotalDownloadedSize();
		nTotalDownloadedSize_ThisTimes = tmp->Get_TotalDownloadedSize_ThisTimes();
	}	

	m_csCntl.Unlock();

	return 1;
}

⌨️ 快捷键说明

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