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

📄 downloaddlg.cpp

📁 多线程下载工具可支持http,ftp,https多协议....vc编写
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
	
	
	//根据协议不同 调用不同的开始任务函数
	if(m_strProt=="http"){
	   http.Begin(m_strURL,m_strSaveas,m_nParts);
	   for(int i=0; i<10000;i++);//增加一个时间延迟,避免数据出错。
	}
	
	if(m_strProt=="ftp"){
      if(m_strUser.IsEmpty()) m_strUser="anonymous";
	  if(m_strPass.IsEmpty()) m_strPass="youremail@youremail.com";
      ftp.Begin(m_strURL,m_strSaveas,m_nParts,m_strUser,m_strPass);
	  for(int i=0; i<10000;i++);
	}
    
	if(m_strProt=="https"){
	   https.Begin(m_strURL,m_strSaveas,m_nParts);
	   for(int i=0; i<10000;i++);
	}

	m_timer=SetTimer(1,100,NULL);//刷新界面的时间控件
	
	//按照用户选择的线程数显示进度条
	switch(m_nParts)
	{
	case 10:
		GetDlgItem(IDC_STATIC10)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS10)->ShowWindow(SW_SHOW);
	case 9:
        GetDlgItem(IDC_STATIC9)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS9)->ShowWindow(SW_SHOW);
	case 8:
        GetDlgItem(IDC_STATIC8)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS8)->ShowWindow(SW_SHOW);
	case 7:
		GetDlgItem(IDC_STATIC7)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS7)->ShowWindow(SW_SHOW);
	case 6:
		GetDlgItem(IDC_STATIC6)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS6)->ShowWindow(SW_SHOW);
	case 5:
		GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS5)->ShowWindow(SW_SHOW);
	case 4:
		GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS4)->ShowWindow(SW_SHOW);
	case 3:
		GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS3)->ShowWindow(SW_SHOW);
	case 2:
		GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS2)->ShowWindow(SW_SHOW);
	case 1:
		GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
        GetDlgItem(IDC_PROGRESS1)->ShowWindow(SW_SHOW);
	}
}

void CDownloadDlg::OnButtonExit()//退出按钮的响应函数,结束进程 
{
	if(m_strProt=="http"){
      for(int i = 0; i < m_nParts; i++){
		if(http.m_hThread[i] != NULL){
			CloseHandle(http.m_hThread[i]);
			http.m_hThread[i] = NULL;
		}
	  }
	}

	if(m_strProt=="ftp"){
      for(int i = 0; i < m_nParts; i++){
		if(ftp.m_hThread[i] != NULL){
			CloseHandle(ftp.m_hThread[i]);
			ftp.m_hThread[i] = NULL;
		}
	  }
	}

	if(m_strProt=="https"){
      for(int i = 0; i < m_nParts; i++){
		if(https.m_hThread[i] != NULL){
			CloseHandle(https.m_hThread[i]);
			https.m_hThread[i] = NULL;
		}
	  }
	}
	CDialog::OnCancel();
}

void CDownloadDlg::OnButtonCancel()//暂停按钮的响应函数,分别调用不同协议的暂停函数
{
   	if(m_strProt=="http"){
      
		KillTimer(m_timer);
		m_speed=0;
		UpdateData(FALSE);
		http.OnCancel();

	}

	if(m_strProt=="ftp"){
        KillTimer(m_timer);
		m_speed=0;
		UpdateData(FALSE);
		ftp.OnCancel();
	}
	
	if(m_strProt=="https"){
		KillTimer(m_timer);
		m_speed=0;
		UpdateData(FALSE);
		https.OnCancel();
	}
}


void CDownloadDlg::OnTimer(UINT nIDEvent)//时间函数,每100毫秒刷新执行 
{
	i++;//速度计算时的计数变量
	if(m_strProt=="http"){
		//进度条的显示
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS1))->SetPos(http.kk[0]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS2))->SetPos(http.kk[1]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS3))->SetPos(http.kk[2]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS4))->SetPos(http.kk[3]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS5))->SetPos(http.kk[4]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS6))->SetPos(http.kk[5]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS7))->SetPos(http.kk[6]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS8))->SetPos(http.kk[7]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS9))->SetPos(http.kk[8]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS10))->SetPos(http.kk[9]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS_Z))->SetPos(http.kk[0]+http.kk[1]+http.kk[2]+http.kk[3]+http.kk[4]+http.kk[5]+http.kk[6]+http.kk[7]+http.kk[8]+http.kk[9]);
		
		//文件大小与完成大小的显示
		m_size=http.m_dwFileSize/1024;
	    m_finished=(http.m_sum[0]+http.m_sum[1]+http.m_sum[2]+http.m_sum[3]+http.m_sum[4]+http.m_sum[5]+http.m_sum[6]+http.m_sum[7]+http.m_sum[8]+http.m_sum[9])/1024;
		
		//速度的计算,由于瞬间速度不稳定,所以采取3秒内的平均速度
		if(m_finished>m_s&&i>=10) {
			speed[j++]=m_finished-m_s;
			m_s=m_finished;
			if(j==3) { m_speed=(speed[0]+speed[1]+speed[2])/3; j=0;}
			i=0;
		}

		UpdateData(FALSE);
	}
	
	if(m_strProt=="ftp"){
        ((CProgressCtrl*)GetDlgItem(IDC_PROGRESS1))->SetPos(ftp.hh[0]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS2))->SetPos(ftp.hh[1]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS3))->SetPos(ftp.hh[2]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS4))->SetPos(ftp.hh[3]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS5))->SetPos(ftp.hh[4]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS6))->SetPos(ftp.hh[5]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS7))->SetPos(ftp.hh[6]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS8))->SetPos(ftp.hh[7]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS9))->SetPos(ftp.hh[8]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS10))->SetPos(ftp.hh[9]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS_Z))->SetPos(ftp.hh[0]+ftp.hh[1]+ftp.hh[2]+ftp.hh[3]+ftp.hh[4]+ftp.hh[5]+ftp.hh[6]+ftp.hh[7]+ftp.hh[8]+ftp.hh[9]);
		
		m_size=ftp.filesize/1024;
		m_finished=(ftp.m_sum[0]+ftp.m_sum[1]+ftp.m_sum[2]+ftp.m_sum[3]+ftp.m_sum[4]+ftp.m_sum[5]+ftp.m_sum[6]+ftp.m_sum[7]+ftp.m_sum[8]+ftp.m_sum[9])/1024;
		
		if(m_finished>m_s&&i>=10) {
			speed[j++]=m_finished-m_s;
			m_s=m_finished;
			if(j==3) { m_speed=(speed[0]+speed[1]+speed[2])/3; j=0;}
			i=0;
		}
		UpdateData(FALSE);
	}
	
	if(m_strProt=="https"){
		
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS1))->SetPos(https.ss[0]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS2))->SetPos(https.ss[1]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS3))->SetPos(https.ss[2]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS4))->SetPos(https.ss[3]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS5))->SetPos(https.ss[4]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS6))->SetPos(https.ss[5]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS7))->SetPos(https.ss[6]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS8))->SetPos(https.ss[7]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS9))->SetPos(https.ss[8]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS10))->SetPos(https.ss[9]);
		((CProgressCtrl*)GetDlgItem(IDC_PROGRESS_Z))->SetPos(https.ss[0]+https.ss[1]+https.ss[2]+https.ss[3]+https.ss[4]+https.ss[5]+https.ss[6]+https.ss[7]+https.ss[8]+https.ss[9]);
		
		//文件大小与完成大小的显示
		m_size=https.m_dwFileSize/1024;
	    m_finished=(https.m_sum[0]+https.m_sum[1]+https.m_sum[2]+https.m_sum[3]+https.m_sum[4]+https.m_sum[5]+https.m_sum[6]+https.m_sum[7]+https.m_sum[8]+https.m_sum[9])/1024;
		
		//速度的计算,由于瞬间速度不稳定,所以采取3秒内的平均速度
		if(m_finished>m_s&&i>=10) {
			speed[j++]=m_finished-m_s;
			m_s=m_finished;
			if(j==3) { m_speed=(speed[0]+speed[1]+speed[2])/3; j=0;}
			i=0;
		}

		UpdateData(FALSE);
	}
    
	if(m_finished>=m_size) {//下载完成时停止时间函数继续执行并对界面进行初始化

	 KillTimer(m_timer);

//	CString str; str.Format("%d---%d---%d",http.m_sum[1],http.m_sum[3],http.m_sum[6]);
//	AfxMessageBox(str);
     for(int i=0;i<10;i++){
			ftp.hh[i]=0;
			ftp.m_sum[i]=0;
			http.kk[i]=0;
			http.m_sum[i]=0;
			https.ss[i]=0;
			https.m_sum[i]=0;
		}

    //隐藏线程进度条
	switch(m_nParts)
	{
	case 10:
		GetDlgItem(IDC_STATIC10)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS10)->ShowWindow(SW_HIDE);
	case 9:
        GetDlgItem(IDC_STATIC9)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS9)->ShowWindow(SW_HIDE);
	case 8:
        GetDlgItem(IDC_STATIC8)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS8)->ShowWindow(SW_HIDE);
	case 7:
		GetDlgItem(IDC_STATIC7)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS7)->ShowWindow(SW_HIDE);
	case 6:
		GetDlgItem(IDC_STATIC6)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS6)->ShowWindow(SW_HIDE);
	case 5:
		GetDlgItem(IDC_STATIC5)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS5)->ShowWindow(SW_HIDE);
	case 4:
		GetDlgItem(IDC_STATIC4)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS4)->ShowWindow(SW_HIDE);
	case 3:
		GetDlgItem(IDC_STATIC3)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS3)->ShowWindow(SW_HIDE);
	case 2:
		GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS2)->ShowWindow(SW_HIDE);
	case 1:
		GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);
        GetDlgItem(IDC_PROGRESS1)->ShowWindow(SW_HIDE);
	}

	//将一部分变量复零
	m_nParts = 1;
    m_strURL = _T("");
    m_strSaveas = _T("");
    m_strPass = _T("");
    m_strUser = _T("");
    m_size = 0;
    m_finished = 0;
	m_speed=0;
	i=0;
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS1))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS2))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS3))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS4))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS5))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS6))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS7))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS8))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS9))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS10))->SetPos(0);
	((CProgressCtrl*)GetDlgItem(IDC_PROGRESS_Z))->SetPos(0);
	UpdateData(FALSE);
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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