当前位置首页 > 百科资料> 正文

多线程下载

2022-06-26 10:26:01 百科资料

线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开启好几个下载通道。

  • 中文名称 多线程下载
  • 原理 服务器同时与多个用户连接
  • 简介 一个线程就是一个文件的下载通道
  • 连接服务器 100个线程。

简介

  线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件都支持多线程。

  注意:实现多线程的条件是服务器支持单一IP多线程下载,如果不支持的话,很有可能封IP或者是只有一个线程能连接成功,多余线程被屏蔽。部分软件提供"用代理下载"方式,这种方式不会封IP。

原理

  多线程下载的原理是这样的:通常服务器同时与多个用户连接,用户之间共享带宽。如果N个用户的优先级都相同,那么每个用户连接到该服务器上的实际带宽就是服务器带宽的N分之一。可以想象,如果用户数目较多,则每个用户只能占有可怜的一点带宽,下载将会是个漫长的过程。

  如果你通过多个线程同时与服务器连接,那么你就可以榨取到较高的带宽了。例如原来有10个用户都通过单一线程与服务器相连,服务器的总带宽假设为56Kbps,则每个用户(每个线程)分到的带宽是5.6Kbps,即0.7K字节/秒。如果你同时打开两个线程与服务器连接,那么共有11个线程与服务器连接,而你获得的带宽将是56/11*2=10.2Kbps,约1.27K字节/秒,将近原来的两倍。你同时打开的线程越多,你所获取的带宽就越大(原来是这样,以后每次我都通过1K个线程连接:P)。当然,这种情况下占用的机器资源也越多。有些号称"疯狂下载"的下载工具甚至可以同时打开100个线程连接服务器。

实例

  自定义 API 线程函数

  DWORD WINAPI DownloadThreadProc(LPVOID pParam)

  {

  CHttpSocket HttpSocket;

  // 成功连接服务器,线程结束

  //。。。。。

  return 1;

  }

  void XXX::GetDownLoadFile(int nSize, CString strDesPath)

  {

  int i = 0, iCount = 0;

  int iFileSize = nSize; // 获取文件大小

  iCount = iFileSize / (4096); // 分段下载 创建线程

  if (iFileSize%(4096))

  iCount++;

  HANDLE hThread[MAX_THREAD_NUM]; // 线程数

  FileDownInfo MyFileDownInfo[MAX_THREAD_NUM];

  for(i=0; i<5; i++)

  {

  hThread[i] = NULL;

  }

  int iThreadWork = iFileSize / (MAX_THREAD_NUM - 1);

  for (i=0 ; i<MAX_THREAD_NUM; i++) // 创建线程

  {

  MyFileDownInfo[i].iThreadNum = i;

  MyFileDownInfo[i].lFromeByte = iThreadWork * i ;

  MyFileDownInfo[i].lToByte = iThreadWork * (i + 1) - 1;

  if(MyFileDownInfo[i].lToByte >= iFileSize)

  {

  MyFileDownInfo[i].lToByte = iFileSize;

  }

  hThread[i] = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)DownloadThreadProc, (VOID*)&MyFileDownInfo[i], NULL, NULL);

  if (hThread[i] == NULL)

  {

  ExitProcess(i);

  return ;

  }

  }

  WaitForMultipleObjects(MAX_THREAD_NUM, hThread, TRUE, INFINITE);

  for (i = 0; i < MAX_THREAD_NUM; i++)

  {

  CloseHandle(hThread[i]);

  }

  }

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net