简介
执行绪可以理解为下载的通道,一个执行绪就是一个档案的下载通道,多执行绪也就是同时开起好几个下载通道.当伺服器提供下载服务时,使用下载者是共享频宽的,在优先权相同的情况下,总伺服器会对总下载执行绪进行平均分配。不难理解,如果你执行绪多的话,那下载的越快。现流行的下载软体都支持多执行绪。注意:实现多执行绪的条件是伺服器支持单一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 { 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]); } }











