多执行绪下载

多执行绪下载

执行绪可以理解为下载的通道,一个执行绪就是一个档案的下载通道,多执行绪也就是同时开启好几个下载通道。

    • 中文名:多执行绪下载
    • 原理:伺服器同时与多个用户连线
    • 简介:一个执行绪就是一个档案的下载通道
    • 连线伺服器: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

{

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]);

}

}

相关词条

相关搜索

其它词条