多執行緒下載

多執行緒下載

執行緒可以理解為下載的通道,一個執行緒就是一個檔案的下載通道,多執行緒也就是同時開啟好幾個下載通道。

基本介紹

簡介,原理,實例,

簡介

執行緒可以理解為下載的通道,一個執行緒就是一個檔案的下載通道,多執行緒也就是同時開起好幾個下載通道.當伺服器提供下載服務時,使用下載者是共享頻寬的,在優先權相同的情況下,總伺服器會對總下載執行緒進行平均分配。不難理解,如果你執行緒多的話,那下載的越快。現流行的下載軟體都支持多執行緒。
注意:實現多執行緒的條件是伺服器支持單一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]);
}
}

相關詞條

熱門詞條

聯絡我們