多執行緒下載

多執行緒下載

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

簡介

執行緒可以理解為下載的通道,一個執行緒就是一個檔案的下載通道,多執行緒也就是同時開起好幾個下載通道.當伺服器提供下載服務時,使用下載者是共享頻寬的,在優先權相同的情況下,總伺服器會對總下載執行緒進行平均分配。不難理解,如果你執行緒多的話,那下載的越快。現流行的下載軟體都支持多執行緒。

注意:實現多執行緒的條件是伺服器支持單一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]);

}

}

熱門詞條

聯絡我們