您好,登錄后才能下訂單哦!
本篇文章為大家展示了使用易語言編寫一個多線程多任務下載器,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
1.DLL命令表
.版本 2 .DLL命令 InternetGetConnectedStateHTTP, , "Wininet.dll", "InternetGetConnectedState", 公開 .參數 lpdwFlags, 整數型, 傳址 .參數 dwReserved, 整數型 .DLL命令 InternetOpenAHTTP, 整數型, "Wininet.dll", "InternetOpenA", 公開 .參數 lpszAgent, 文本型 .參數 dwAccessType, 整數型 .參數 lpszProxyName, 整數型 .參數 lpszProxyBypass, 整數型 .參數 dwFlags, 整數型 .DLL命令 InternetOpenUrlAHTTP, 整數型, "Wininet.dll", "InternetOpenUrlA", 公開 .參數 hInternet, 整數型 .參數 lpszUrl, 文本型 .參數 lpszHeaders, 文本型 .參數 dwHeadersLength, 整數型 .參數 dwFlags, 整數型 .參數 dwContext, 整數型 .DLL命令 InternetCloseHandleHTTP, , "Wininet.dll", "InternetCloseHandle", 公開 .參數 handle, 整數型 .DLL命令 HttpQueryInfoAHTTP, 整數型, "Wininet.dll", "HttpQueryInfoA", 公開 .參數 hRequest, 整數型 .參數 dwInfoLevel, 整數型 .參數 lpvBuffer, 整數型, 傳址 .參數 lpdwBufferLength, 整數型, 傳址 .參數 lpdwIndex, 整數型, 傳址 .DLL命令 創建文件, 整數型, "kernel32.dll", "CreateFileA", 公開 .參數 文件名, 文本型 .參數 打開方式, 整數型, , -2147483648表示讀,1073741824表示寫,0可取屬性 .參數 共享方式, 整數型, , 1共享讀,2共享寫,0不共享 .參數 安全性, 整數型, , 為空即可 .參數 打開方式2, 整數型, , 1創建文件(文件存在出錯),2創建文件(改寫),3文件必須存在,4如果文件不存在則創建,5將現有文件縮短為0 .參數 文件屬性, 整數型, , 128默認屬性,268435456隨機訪問優化,134217728連續訪問優化,67108864臨時文件 .參數 文件句柄, 整數型, , 一般為0 .DLL命令 創建映射, 整數型, "kernel32.dll", "CreateFileMappingA", 公開 .參數 文件句柄, 整數型 .參數 安全對象, 整數型, , 0表示默認屬性 .參數 映射方式, 整數型, , 2表示只讀,4表示可讀寫 .參數 高32位, 整數型, , 文件映射的最大長度(高32位) .參數 低32位, 整數型, , 文件映射的最小長度(低32位) .參數 對象名字, 整數型, , 可以更改為文件型 .DLL命令 映射裝載, 整數型, "kernel32.dll", "MapViewOfFile", 公開 .參數 映射句柄, 整數型 .參數 映射方式, 整數型, , 2可讀可寫,4只讀, .參數 高32位, 整數型, , 文件中映射起點的高32位地址,64k的整數倍 .參數 低32位, 整數型, , 文件中映射起點的低32位地址,64k的整數倍 .參數 字節數, 整數型, , 文件中要映射的字節數,根據實際長度指定 .DLL命令 映射卸載, 整數型, "kernel32.dll", "UnmapViewOfFile", 公開 .參數 映射地址, 整數型, , 用映射裝載函數獲得的 .DLL命令 CloseHandleHTTP, 整數型, "kernel32.dll", "CloseHandle", 公開 .參數 hObject, 整數型 .DLL命令 HeapCreate, 整數型, "kernel32.dll", "HeapCreate", 公開 .參數 flOptions, 整數型 .參數 dwInitialSize, 整數型 .參數 dwMaximumSize, 整數型 .DLL命令 HeapAllocHTTP, 整數型, "kernel32.dll", "HeapAlloc", 公開 .參數 hHeap, 整數型 .參數 dwFlags, 整數型 .參數 dwBytes, 整數型 .DLL命令 HeapDestroy, 邏輯型, "kernel32.dll", "HeapDestroy", 公開 .參數 hHeap, 整數型 .DLL命令 RtlMoveMemory_讀整數, , "kernel32.dll", "RtlMoveMemory", 公開 .參數 Destination, 整數型, 傳址 .參數 Source, 整數型 .參數 Length, 整數型 .DLL命令 RtlMoveMemory_寫整數, , "kernel32.dll", "RtlMoveMemory", 公開 .參數 Destination, 整數型 .參數 Source, 整數型, 傳址 .參數 Length, 整數型 .DLL命令 RtlMoveMemory_寫文本, , "kernel32.dll", "RtlMoveMemory", 公開 .參數 Destination, 整數型 .參數 Source, 文本型, 傳址 .參數 Length, 整數型 .DLL命令 InitializeCriticalSectionHTTP, , "kernel32.dll", "InitializeCriticalSection", 公開 .參數 lpCriticalSection, 整數型 .DLL命令 CreateThreadHTTP, 整數型, "kernel32.dll", "CreateThread", 公開 .參數 lpThreadAttributes, 整數型 .參數 dwStackSize, 整數型 .參數 lpStartAddress, 子程序指針 .參數 lpParameter, 整數型 .參數 dwCreationFlags, 整數型 .參數 lpThreadId, 整數型, 傳址 .DLL命令 DeleteCriticalSectionHTTP, , "kernel32.dll", "DeleteCriticalSection", 公開 .參數 lpCriticalSection, 整數型 .DLL命令 EnterCriticalSectionHTTP, , "kernel32.dll", "EnterCriticalSection", 公開 .參數 lpCriticalSection, 整數型 .DLL命令 LeaveCriticalSectionHTTP, , "kernel32.dll", "LeaveCriticalSection", 公開 .參數 lpCriticalSection, 整數型 .DLL命令 WaitForSingleObjectHTTP, 整數型, "kernel32.dll", "WaitForSingleObject", 公開 .參數 hHandle, 整數型 .參數 dwMilliseconds, 整數型 .DLL命令 InternetReadFileHTTP, 整數型, "Wininet.dll", "InternetReadFile", 公開 .參數 hFile, 整數型 .參數 lpBuffer, 整數型 .參數 dwNumberOfBytesToRead, 整數型 .參數 lpdwNumberOfBytesRead, 整數型, 傳址 .DLL命令 寫入映射, , "kernel32.dll", "RtlMoveMemory", 公開 .參數 起始位置, 整數型, , 用映射裝載命令得到的 .參數 待寫入數據, 整數型, , 要寫入的數據,可以更改為其他類型 .參數 數據長度, 整數型, , 要寫入的數據長度,不大于實際數據長度 .DLL命令 HeapFree, 邏輯型, "kernel32.dll", "HeapFree", 公開 .參數 hHeap, 整數型 .參數 dwFlags, 整數型 .參數 lpMem, 整數型 .DLL命令 PathFindExtensionAjtw, 文本型, "shlwapi.dll", "PathFindExtensionA", 公開 .參數 文件路徑, 文本型 .DLL命令 InternetGetConnectedState, 邏輯型, "Wininet.dll", "InternetGetConnectedState", 公開, 本來是無返回值 .參數 lpdwFlags, 整數型, 傳址 .參數 dwReserved, 整數型 .DLL命令 HttpQueryInfohx, 整數型, "wininet.dll", "HttpQueryInfoA", 公開 .參數 Internet請求句柄, 整數型 .參數 待查信息, 整數型 .參數 返回容器, 文本型, 傳址 .參數 返回容器長度, 整數型, 傳址 .參數 lpdwIndex, 整數型, 傳址
2.全局變量表
.版本 2 .全局變量 配備文本變量, 文本型, , "0" .全局變量 多任務句柄, 整數型, , "0"
3.多線程
.版本 2 .程序集 程序集2 .子程序 文件_取網絡文件名1, 文本型, 公開 .參數 地址, 文本型 .局部變量 Onlined, 邏輯型 .局部變量 dwFlags, 整數型 .局部變量 strAgent, 文本型 .局部變量 hConnect, 整數型 .局部變量 hOpen, 整數型 .局部變量 szTemp, 文本型 .局部變量 dwSizeOfRq, 整數型 Onlined = InternetGetConnectedState (dwFlags, 0) .如果真 (Onlined = 假) 返回 (取文件名11 (地址)) .如果真結束 strAgent = “我的下載” + 到文本 (取啟動時間 ()) .如果 (位與 (dwFlags, 4) = 0) hOpen = InternetOpenAHTTP (strAgent, 4, 0, 0, 0) .否則 hOpen = InternetOpenAHTTP (strAgent, 0, 0, 0, 0) .如果結束 .如果真 (hOpen = 0) 返回 (取文件名11 (地址)) .如果真結束 hConnect = InternetOpenUrlAHTTP (hOpen, 地址, “”, 0, 2097152 + 2147483648 + 67108864 + 256, 0) .如果真 (hConnect = 0) InternetCloseHandleHTTP (hOpen) 返回 (取文件名11 (地址)) .如果真結束 szTemp = 取空白文本 (255) dwSizeOfRq = 255 .如果真 (HttpQueryInfohx (hConnect, 51, szTemp, dwSizeOfRq, 0) = 0) InternetCloseHandleHTTP (hOpen) 返回 (取文件名11 (地址)) .如果真結束 InternetCloseHandleHTTP (hOpen) 返回 (取文件名11 (szTemp)) .子程序 取文件名11, 文本型 .參數 地址, 文本型 .局部變量 i, 整數型 .局部變量 szTemp, 文本型 szTemp = 子文本替換 (地址, “\”, “/”, , , 真) i = 倒找文本 (szTemp, “/”, , 假) .如果真 (i ≠ -1) szTemp = 取文本右邊 (szTemp, 取文本長度 (szTemp) - i) .如果真結束 i = 尋找文本 (szTemp, “?”, , 假) .如果真 (i = -1) 返回 (szTemp) .如果真結束 返回 (取文本左邊 (szTemp, i - 1)) .子程序 文件_取擴展名, 文本型, 公開, 返回一個文件的后綴名,如:.jpg 如果沒有后綴,返回空 .參數 文件名, 文本型, , 需要處理的原始文件名 返回 (PathFindExtensionAjtw (文件名)) .子程序 多線程_HTTP下載_開始_多任務, 整數型 .參數 參數_下載地址, 文本型 .參數 參數_保存路徑, 文本型, , 可以只填寫下載路徑,程序將會以下載地址的文件名來保存,如果自己添加路徑加文件名,則程序會將以自己添加的文件名來命名,注意:路徑中不能有 . ,除非是添加路徑加文件名 .參數 參數_線程數, 整數型 .參數 參數_回調函數地址, 整數型 .局部變量 變量_dwFlags, 整數型 .局部變量 變量_hOpen, 整數型 .局部變量 變量_szHead, 文本型 .局部變量 變量_hConnect, 整數型 .局部變量 變量_dwByteToRead, 整數型 .局部變量 變量_dwSizeOfRq, 整數型 .局部變量 變量_文件句柄, 整數型 .局部變量 變量_映射句柄, 整數型 .局部變量 變量_塊, 整數型 .局部變量 變量_次數, 整數型 .局部變量 變量_hHeap, 整數型 .局部變量 變量_msg, 整數型 .局部變量 變量_地址, 整數型 .局部變量 變量_許可證, 整數型 .局部變量 變量_當前線程數, 整數型 .局部變量 變量_進程句柄, 整數型 .局部變量 c, 文本型, , "0" .局部變量 a, 文本型 .局部變量 cc, 文本型 a = 文件_取擴展名 (參數_保存路徑) .如果真 (a = “”) .如果 (取文本右邊 (參數_保存路徑, 1) = “\”) cc = 文件_取網絡文件名1 (參數_下載地址) 參數_保存路徑 = 參數_保存路徑 + cc .否則 cc = 文件_取網絡文件名1 (參數_下載地址) 參數_保存路徑 = 參數_保存路徑 + “\” + cc .如果結束 .如果真結束 .如果 (倒找文本 (參數_保存路徑, “.”, , 假) = -1) ' 那么就是 路徑 ,沒有文件名 c = 分割文本 (參數_保存路徑, “\”, ) .如果真 (取文本右邊 (參數_保存路徑, 1) ≠ “\”) 參數_保存路徑 = 參數_保存路徑 + “\” .如果真結束 參數_保存路徑 = 參數_保存路徑 + c [取數組成員數 (c)] .否則 .如果結束 ' 取文件大小 InternetGetConnectedStateHTTP (變量_dwFlags, 0) .如果 (位與 (變量_dwFlags, 4) = 0) 變量_hOpen = InternetOpenAHTTP (字符 (0), 4, 0, 0, 0) .否則 變量_hOpen = InternetOpenAHTTP (字符 (0), 0, 0, 0, 0) .如果結束 .如果真 (變量_hOpen = 0) ' Internet連接錯誤 返回 (-1) .如果真結束 變量_szHead = “Accept: */*” + #換行符 + “Accept-Language: zh-cn” + #換行符 + “Accept-Encoding: gzip, deflate” + #換行符 + “User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)” 變量_hConnect = InternetOpenUrlAHTTP (變量_hOpen, 參數_下載地址, 變量_szHead, 取文本長度 (變量_szHead), 2214592768, 0) .如果真 (變量_hConnect = 0) ' 不能打開該URL! InternetCloseHandleHTTP (變量_hOpen) 返回 (-1) .如果真結束 變量_dwByteToRead = 0 變量_dwSizeOfRq = 4 .如果真 (HttpQueryInfoAHTTP (變量_hConnect, 536870917, 變量_dwByteToRead, 變量_dwSizeOfRq, 0) = 0) 變量_dwByteToRead = 0 .如果真結束 InternetCloseHandleHTTP (變量_hConnect) InternetCloseHandleHTTP (變量_hOpen) ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 創建文件 變量_文件句柄 = 創建文件 (參數_保存路徑, 位或 (-2147483648, 1073741824), 位或 (1, 2), 0, 2, 0, 0) .如果真 (變量_文件句柄 = -1) 返回 (-1) .如果真結束 變量_映射句柄 = 創建映射 (變量_文件句柄, 0, 4, 0, 變量_dwByteToRead, 0) .如果真 (變量_映射句柄 = 0) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 .如果真 (變量_dwByteToRead = 0) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (0) .如果真結束 ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 計算分段 變量_塊 = 1024 × 1024 變量_次數 = 變量_dwByteToRead ÷ 變量_塊 .如果真 (變量_dwByteToRead % 變量_塊 ≠ 0) 變量_次數 = 變量_次數 + 1 .如果真結束 .如果真 (參數_線程數 > 變量_次數) 參數_線程數 = 變量_次數 .如果真結束 ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 傳遞信息結構 變量_hHeap = HeapCreate (4, 0, 0) .如果真 (變量_hHeap = 0) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 ' 下載地址指針,回調函數地址+4,文件句柄+8,映射句柄+12,堆+16,許可證指針+20,線程數+24,當前線程數+28,任務狀態+32,塊+36,當前次數+40,總次數+44,完成大小+48,文件大小+52,傳遞完畢+56 變量_msg = HeapAllocHTTP (變量_hHeap, 8, 15 × 4) .如果真 (變量_msg = 0) HeapDestroy (變量_hHeap) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 變量_地址 = HeapAllocHTTP (變量_hHeap, 8, 取文本長度 (參數_下載地址) + 1) .如果真 (變量_地址 = 0) HeapDestroy (變量_hHeap) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 RtlMoveMemory_寫文本 (變量_地址, 參數_下載地址, 取文本長度 (參數_下載地址) + 1) 變量_許可證 = HeapAllocHTTP (變量_hHeap, 8, 24) .如果真 (變量_許可證 = 0) HeapDestroy (變量_hHeap) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 InitializeCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (變量_msg, 變量_地址, 4) RtlMoveMemory_寫整數 (變量_msg + 4, 參數_回調函數地址, 4) RtlMoveMemory_寫整數 (變量_msg + 8, 變量_文件句柄, 4) RtlMoveMemory_寫整數 (變量_msg + 12, 變量_映射句柄, 4) RtlMoveMemory_寫整數 (變量_msg + 16, 變量_hHeap, 4) RtlMoveMemory_寫整數 (變量_msg + 20, 變量_許可證, 4) RtlMoveMemory_寫整數 (變量_msg + 24, 參數_線程數, 4) RtlMoveMemory_寫整數 (變量_msg + 28, 變量_當前線程數, 4) RtlMoveMemory_寫整數 (變量_msg + 32, 0, 4) ' -1錯誤 0開始 1停止 2暫停 RtlMoveMemory_寫整數 (變量_msg + 36, 變量_塊, 4) RtlMoveMemory_寫整數 (變量_msg + 40, 0, 4) RtlMoveMemory_寫整數 (變量_msg + 44, 變量_次數, 4) RtlMoveMemory_寫整數 (變量_msg + 48, 0, 4) RtlMoveMemory_寫整數 (變量_msg + 52, 變量_dwByteToRead, 4) ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 創建線程 變量_進程句柄 = CreateThreadHTTP (0, 0, &HTTP下載處理_1_多任務, 變量_msg, 0, 0) .如果真 (變量_進程句柄 = 0) DeleteCriticalSectionHTTP (變量_許可證) HeapDestroy (變量_hHeap) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) 返回 (-1) .如果真結束 CloseHandleHTTP (變量_進程句柄) 返回 (變量_msg) .子程序 多線程_HTTP下載_停止, , 公開 .參數 參數_句柄, 整數型 .局部變量 變量_許可證, 整數型 RtlMoveMemory_讀整數 (變量_許可證, 參數_句柄 + 20, 4) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_句柄 + 32, 1, 4) ' -1錯誤 0開始 1停止 2暫停 LeaveCriticalSectionHTTP (變量_許可證) .子程序 多線程_HTTP下載_暫停, , 公開 .參數 參數_句柄, 整數型 .局部變量 變量_許可證, 整數型 RtlMoveMemory_讀整數 (變量_許可證, 參數_句柄 + 20, 4) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_句柄 + 32, 2, 4) ' -1錯誤 0開始 1停止 2暫停 LeaveCriticalSectionHTTP (變量_許可證) .子程序 多線程_HTTP下載_繼續, , 公開 .參數 參數_句柄, 整數型 .局部變量 變量_許可證, 整數型 RtlMoveMemory_讀整數 (變量_許可證, 參數_句柄 + 20, 4) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_句柄 + 32, 0, 4) ' -1錯誤 0開始 1停止 2暫停 LeaveCriticalSectionHTTP (變量_許可證) .子程序 HTTP下載處理_1_多任務 .參數 參數_信息指針, 整數型 .局部變量 變量_回調函數地址, 整數型 .局部變量 變量_文件句柄, 整數型 .局部變量 變量_映射句柄, 整數型 .局部變量 變量_堆, 整數型 .局部變量 變量_許可證, 整數型 .局部變量 變量_線程數, 整數型 .局部變量 變量_總次數, 整數型 .局部變量 變量_文件大小, 整數型 .局部變量 變量_當前次數, 整數型 .局部變量 變量_當前線程數, 整數型 .局部變量 變量_任務狀態, 整數型 .局部變量 變量_進程句柄, 整數型 .局部變量 變量_傳遞完畢, 整數型 .局部變量 變量_完成大小, 整數型 .局部變量 i, 整數型 .局部變量 a, 文本型 .局部變量 傳遞ID, 整數型 ' 下載地址指針,回調函數地址+4,文件句柄+8,映射句柄+12,堆+16,許可證指針+20,線程數+24,當前線程數+28,任務狀態+32,塊+36,當前次數+40,總次數+44,完成大小+48,文件大小+52,傳遞完畢+56 RtlMoveMemory_讀整數 (變量_回調函數地址, 參數_信息指針 + 4, 4) RtlMoveMemory_讀整數 (變量_文件句柄, 參數_信息指針 + 8, 4) RtlMoveMemory_讀整數 (變量_映射句柄, 參數_信息指針 + 12, 4) RtlMoveMemory_讀整數 (變量_堆, 參數_信息指針 + 16, 4) RtlMoveMemory_讀整數 (變量_許可證, 參數_信息指針 + 20, 4) RtlMoveMemory_讀整數 (變量_線程數, 參數_信息指針 + 24, 4) RtlMoveMemory_讀整數 (變量_總次數, 參數_信息指針 + 44, 4) RtlMoveMemory_讀整數 (變量_文件大小, 參數_信息指針 + 52, 4) 變量_當前次數 = 0 .判斷循環首 (變量_當前次數 < 變量_總次數) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) LeaveCriticalSectionHTTP (變量_許可證) .如果真 (變量_當前線程數 < 變量_線程數) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_任務狀態, 參數_信息指針 + 32, 4) LeaveCriticalSectionHTTP (變量_許可證) .如果真 (變量_任務狀態 = -1 或 變量_任務狀態 = 1) 跳出循環 () .如果真結束 .如果真 (變量_任務狀態 = 2) WaitForSingleObjectHTTP (-1, 100) 到循環尾 () .如果真結束 變量_當前次數 = 變量_當前次數 + 1 RtlMoveMemory_寫整數 (參數_信息指針 + 40, 變量_當前次數, 4) 變量_進程句柄 = CreateThreadHTTP (0, 0, &HTTP下載處理_2_多任務, 參數_信息指針, 0, 0) .如果真 (變量_進程句柄 = 0) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) LeaveCriticalSectionHTTP (變量_許可證) 跳出循環 () .如果真結束 CloseHandleHTTP (變量_進程句柄) .循環判斷首 () EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_傳遞完畢, 參數_信息指針 + 56, 4) LeaveCriticalSectionHTTP (變量_許可證) WaitForSingleObjectHTTP (-1, 100) .循環判斷尾 (變量_傳遞完畢 = 0) .如果真結束 WaitForSingleObjectHTTP (-1, 100) .判斷循環尾 () .循環判斷首 () EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) LeaveCriticalSectionHTTP (變量_許可證) WaitForSingleObjectHTTP (-1, 100) .循環判斷尾 (變量_當前線程數 ≠ 0) RtlMoveMemory_讀整數 (變量_任務狀態, 參數_信息指針 + 32, 4) .判斷開始 (變量_任務狀態 = -1) .計次循環首 (取數組成員數 (多任務句柄), i) .如果真 (參數_信息指針 = 多任務句柄 [i]) 傳遞ID = i .如果真結束 .計次循環尾 () .如果真 (傳遞ID ≠ 0) 程序_Call (變量_回調函數地址, 傳遞ID, -1, 0, 0) ' 調用子程序 (變量_回調函數地址, , , 傳遞ID, -1, 0, 0) .如果真結束 .判斷 (變量_任務狀態 = 0) RtlMoveMemory_讀整數 (變量_完成大小, 參數_信息指針 + 48, 4) .計次循環首 (取數組成員數 (多任務句柄), i) .如果真 (參數_信息指針 = 多任務句柄 [i]) 傳遞ID = i .如果真結束 .計次循環尾 () .如果真 (傳遞ID ≠ 0) 程序_Call (變量_回調函數地址, 傳遞ID, 0, 變量_文件大小, 變量_完成大小) ' 調用子程序 (變量_回調函數地址, , , 傳遞ID, 0, 變量_文件大小, 變量_完成大小) .如果真結束 .默認 .判斷結束 DeleteCriticalSectionHTTP (變量_許可證) HeapDestroy (變量_堆) CloseHandleHTTP (變量_映射句柄) CloseHandleHTTP (變量_文件句柄) .子程序 HTTP下載處理_2_多任務 .參數 參數_信息指針, 整數型 .局部變量 變量_下載地址指針, 整數型 .局部變量 變量_回調函數地址, 整數型 .局部變量 變量_映射句柄, 整數型 .局部變量 變量_許可證, 整數型 .局部變量 變量_堆, 整數型 .局部變量 變量_當前線程數, 整數型 .局部變量 變量_塊_1, 整數型 .局部變量 變量_當前次數, 整數型 .局部變量 變量_總次數, 整數型 .局部變量 變量_文件大小, 整數型 .局部變量 變量_dwFlags, 整數型 .局部變量 變量_hOpen, 整數型 .局部變量 變量_szHead, 文本型 .局部變量 變量_開始, 整數型 .局部變量 變量_結尾, 整數型 .局部變量 變量_hConnect, 整數型 .局部變量 變量_塊_2, 整數型 .局部變量 變量_http塊, 整數型 .局部變量 變量_當前大小, 整數型 .局部變量 變量_szTemp, 整數型 .局部變量 變量_dwSize, 整數型 .局部變量 變量_寫入位置, 整數型 .局部變量 變量_塊位置, 整數型 .局部變量 變量_視圖句柄, 整數型 .局部變量 變量_完成大小, 整數型 .局部變量 變量_任務狀態, 整數型 .局部變量 i, 整數型 .局部變量 a, 文本型 .局部變量 傳遞ID, 整數型 ' 下載地址指針,回調函數地址+4,文件句柄+8,映射句柄+12,堆+16,許可證指針+20,線程數+24,當前線程數+28,任務狀態+32,塊+36,當前次數+40,總次數+44,完成大小+48,文件大小+52,傳遞完畢+56 RtlMoveMemory_讀整數 (變量_下載地址指針, 參數_信息指針, 4) RtlMoveMemory_讀整數 (變量_回調函數地址, 參數_信息指針 + 4, 4) RtlMoveMemory_讀整數 (變量_映射句柄, 參數_信息指針 + 12, 4) RtlMoveMemory_讀整數 (變量_堆, 參數_信息指針 + 16, 4) RtlMoveMemory_讀整數 (變量_許可證, 參數_信息指針 + 20, 4) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_讀整數 (變量_塊_1, 參數_信息指針 + 36, 4) RtlMoveMemory_讀整數 (變量_當前次數, 參數_信息指針 + 40, 4) RtlMoveMemory_讀整數 (變量_文件大小, 參數_信息指針 + 52, 4) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 28, 變量_當前線程數 + 1, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 56, 1, 4) LeaveCriticalSectionHTTP (變量_許可證) InternetGetConnectedStateHTTP (變量_dwFlags, 0) .如果 (位與 (變量_dwFlags, 4) = 0) 變量_hOpen = InternetOpenAHTTP (字符 (0), 4, 0, 0, 0) .否則 變量_hOpen = InternetOpenAHTTP (字符 (0), 0, 0, 0, 0) .如果結束 .如果真 (變量_hOpen = 0) ' Internet連接錯誤 EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 28, 變量_當前線程數 - 1, 4) LeaveCriticalSectionHTTP (變量_許可證) 返回 () .如果真結束 .如果 (變量_當前次數 = 變量_總次數) 變量_開始 = 變量_塊_1 × (變量_當前次數 - 1) 變量_結尾 = 變量_文件大小 .否則 變量_開始 = 變量_塊_1 × (變量_當前次數 - 1) 變量_結尾 = 變量_塊_1 × 變量_當前次數 - 1 .如果結束 變量_szHead = “Accept: */*” + #換行符 + “Accept-Language: zh-cn” + #換行符 + “Accept-Encoding: gzip, deflate” + #換行符 + “User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)” 變量_szHead = 變量_szHead + #換行符 + “Range:bytes=” + 到文本 (變量_開始) + “-” + 到文本 (變量_結尾) 變量_hConnect = InternetOpenUrlAHTTP (變量_hOpen, 指針到文本 (變量_下載地址指針), 變量_szHead, 取文本長度 (變量_szHead), 2214592768, 0) .如果真 (變量_hConnect = 0) ' 不能打開該URL! InternetCloseHandleHTTP (變量_hOpen) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 28, 變量_當前線程數 - 1, 4) LeaveCriticalSectionHTTP (變量_許可證) 返回 () .如果真結束 變量_塊_2 = 65536 變量_http塊 = 20480 變量_當前大小 = 0 變量_szTemp = HeapAllocHTTP (變量_堆, 8, 變量_http塊) .如果真 (變量_szTemp = 0) InternetCloseHandleHTTP (變量_hConnect) InternetCloseHandleHTTP (變量_hOpen) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 28, 變量_當前線程數 - 1, 4) LeaveCriticalSectionHTTP (變量_許可證) 返回 () .如果真結束 .循環判斷首 () .如果真 (InternetReadFileHTTP (變量_hConnect, 變量_szTemp, 變量_http塊, 變量_dwSize) = 0) ' 讀文件失敗 EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) LeaveCriticalSectionHTTP (變量_許可證) 跳出循環 () .如果真結束 .如果真 (變量_dwSize = 0) 跳出循環 () .如果真結束 變量_寫入位置 = 變量_開始 + 變量_當前大小 變量_塊位置 = 變量_寫入位置 ÷ 變量_塊_2 變量_塊位置 = 變量_塊位置 × 變量_塊_2 變量_視圖句柄 = 映射裝載 (變量_映射句柄, 2, 0, 變量_塊位置, 變量_寫入位置 - 變量_塊位置 + 變量_dwSize) .如果真 (變量_視圖句柄 = 0) ' 映射裝載失敗 EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_寫整數 (參數_信息指針 + 32, -1, 4) LeaveCriticalSectionHTTP (變量_許可證) 跳出循環 () .如果真結束 寫入映射 (變量_視圖句柄 + 變量_寫入位置 - 變量_塊位置, 變量_szTemp, 變量_dwSize) 映射卸載 (變量_視圖句柄) 變量_當前大小 = 變量_當前大小 + 變量_dwSize EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_完成大小, 參數_信息指針 + 48, 4) 變量_完成大小 = 變量_完成大小 + 變量_dwSize RtlMoveMemory_寫整數 (參數_信息指針 + 48, 變量_完成大小, 4) ' 輸出調試文本 (參數_信息指針) .計次循環首 (取數組成員數 (多任務句柄), i) .如果真 (參數_信息指針 = 多任務句柄 [i]) 傳遞ID = i .如果真結束 .計次循環尾 () .如果真 (傳遞ID ≠ 0) 程序_Call (變量_回調函數地址, 傳遞ID, 1, 變量_文件大小, 變量_完成大小) ' 調用子程序 (變量_回調函數地址, , , 傳遞ID, 1, 變量_文件大小, 變量_完成大小) .如果真結束 RtlMoveMemory_讀整數 (變量_任務狀態, 參數_信息指針 + 32, 4) LeaveCriticalSectionHTTP (變量_許可證) .判斷循環首 (變量_任務狀態 = 2) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_任務狀態, 參數_信息指針 + 32, 4) LeaveCriticalSectionHTTP (變量_許可證) .如果真 (變量_任務狀態 = -1 或 變量_任務狀態 = 1) 跳出循環 () .如果真結束 WaitForSingleObjectHTTP (-1, 100) .判斷循環尾 () .循環判斷尾 (變量_任務狀態 ≠ -1 且 變量_任務狀態 ≠ 1) HeapFree (變量_堆, 0, 變量_szTemp) InternetCloseHandleHTTP (變量_hConnect) InternetCloseHandleHTTP (變量_hOpen) EnterCriticalSectionHTTP (變量_許可證) RtlMoveMemory_讀整數 (變量_當前線程數, 參數_信息指針 + 28, 4) RtlMoveMemory_寫整數 (參數_信息指針 + 28, 變量_當前線程數 - 1, 4) LeaveCriticalSectionHTTP (變量_許可證) .子程序 Call, 整數型, 公開 .參數 參數_地址, 整數型 .參數 參數_一, 整數型 .參數 參數_二, 整數型 .參數 參數_三, 整數型 置入代碼 ({ 201, 88, 135, 4, 36, 255, 224 }) 返回 (0) .子程序 程序_Call, 整數型 .參數 子程序地址, 整數型 .參數 參數1, 整數型, 可空 .參數 參數2, 整數型, 可空 .參數 參數3, 整數型, 可空 .參數 參數4, 整數型, 可空 .參數 參數5, 整數型, 可空 .參數 參數6, 整數型, 可空 .參數 參數7, 整數型, 可空 .參數 參數8, 整數型, 可空 .參數 參數9, 整數型, 可空 .參數 參數10, 整數型, 可空 .參數 參數11, 整數型, 可空 .參數 參數12, 整數型, 可空 .參數 參數13, 整數型, 可空 .參數 參數14, 整數型, 可空 .參數 參數15, 整數型, 可空 置入代碼 ({ 86, 190, 15, 0, 0, 0, 141, 77, 8, 141, 76, 241, 252, 139, 65, 4, 133, 192, 116, 2, 255, 49, 78, 131, 233, 8, 133, 246, 117, 239, 255, 85, 8, 94, 201, 194, 124, 0 }) 返回 (0)
4.多任務下載
.版本 2 .程序集 下載_多任務, , 公開 .程序集變量 總計次, 整數型 .子程序 _初始化, , , 當基于本類的對象被創建后,此方法會被自動調用 總計次 = 0 .子程序 _銷毀, , , 當基于本類的對象被銷毀前,此方法會被自動調用 .子程序 下載_多任務, , 公開 .參數 下載地址, 文本型 .參數 保存路徑, 文本型 .參數 線程數, 整數型 .參數 回調函數地址, 整數型, 可空, 無返回值,傳遞ID=整數型,信息=整數型,文件大小=整數型,完成大小=整數型 .局部變量 a, 整數型 總計次 = 總計次 + 1 加入成員 (配備文本變量, 到文本 (總計次)) a = 多線程_HTTP下載_開始_多任務 (下載地址, 保存路徑, 線程數, 回調函數地址) 加入成員 (多任務句柄, a) .子程序 暫停下載, , 公開 .參數 暫停ID, 整數型 多線程_HTTP下載_暫停 (多任務句柄 [暫停ID]) .子程序 全部暫停, , 公開 .局部變量 i, 整數型 .計次循環首 (取數組成員數 (多任務句柄), i) 多線程_HTTP下載_暫停 (多任務句柄 [i]) .計次循環尾 () .子程序 停止下載 .參數 停止ID, 整數型 多線程_HTTP下載_停止 (多任務句柄 [停止ID]) .子程序 全部停止, , 公開 .局部變量 i, 整數型 .計次循環首 (取數組成員數 (多任務句柄), i) 多線程_HTTP下載_停止 (多任務句柄 [i]) .計次循環尾 () .子程序 繼續下載, , 公開 .參數 繼續ID, 整數型 多線程_HTTP下載_繼續 (多任務句柄 [繼續ID]) .子程序 全部繼續, , 公開 .局部變量 i, 整數型 .計次循環首 (取數組成員數 (多任務句柄), i) 多線程_HTTP下載_繼續 (多任務句柄 [i]) .計次循環尾 () .子程序 重試下載, , 公開 .參數 重試ID, 整數型 多線程_HTTP下載_停止 (多任務句柄 [重試ID]) 多線程_HTTP下載_繼續 (多任務句柄 [重試ID]) .子程序 全部重試, , 公開 .局部變量 i, 整數型 .計次循環首 (取數組成員數 (多任務句柄), i) 多線程_HTTP下載_停止 (多任務句柄 [i]) 多線程_HTTP下載_繼續 (多任務句柄 [i]) .計次循環尾 ()
以上是模塊代碼,下面是窗口程序集代碼。
多線程多任務下載源碼
需要加載上面的多線程多任務下載的模塊
.版本 2 .支持庫 iext .程序集 窗口程序集1 .程序集變量 計次, 整數型 .程序集變量 下載, 下載_多任務 .程序集變量 速度1, 整數型 .程序集變量 速度2, 整數型 .子程序 內部回調, , 公開 .參數 傳遞ID, 整數型 .參數 信息 .參數 文件大小 .參數 完成大小 .局部變量 索引, 整數型 .局部變量 顯示完成大小, 文本型 .局部變量 顯示文件大小, 文本型 .如果真 (傳遞ID > 3 或 傳遞ID < 0) 返回 () .如果真結束 .如果真 (傳遞ID = 1) 索引 = 0 .如果真結束 .如果真 (傳遞ID = 2) 索引 = 1 .如果真結束 .如果真 (傳遞ID = 3) 索引 = 2 .如果真結束 .如果真 (四舍五入 (完成大小, 1) < 1024) 顯示文件大小 = 到文本 (四舍五入 (文件大小, 1)) + “ Byte” .如果真結束 .如果真 (四舍五入 (完成大小, 1) > 1024) 顯示文件大小 = 到文本 (四舍五入 (文件大小 ÷ 1024, 1)) + “ KB” .如果真結束 .如果真 (四舍五入 (完成大小 ÷ 1024, 1) > 1024) 顯示文件大小 = 到文本 (四舍五入 (文件大小 ÷ 1024 ÷ 1024, 1)) + “ MB” .如果真結束 .如果真 (四舍五入 (文件大小 ÷ 1024 ÷ 1024, 1) > 1024) 顯示文件大小 = 到文本 (四舍五入 (文件大小 ÷ 1024 ÷ 1024 ÷ 1024, 1)) + “ GB” .如果真結束 .如果真 (四舍五入 (完成大小, 1) < 1024) 顯示完成大小 = 到文本 (四舍五入 (完成大小, 1)) + “ Byte” .如果真結束 .如果真 (四舍五入 (完成大小, 1) > 1024) 顯示完成大小 = 到文本 (四舍五入 (完成大小 ÷ 1024, 1)) + “ KB” .如果真結束 .如果真 (四舍五入 (完成大小 ÷ 1024, 1) > 1024) 顯示完成大小 = 到文本 (四舍五入 (完成大小 ÷ 1024 ÷ 1024, 1)) + “ MB” .如果真結束 .如果真 (四舍五入 (完成大小 ÷ 1024 ÷ 1024, 1) > 1024) 顯示完成大小 = 到文本 (四舍五入 (完成大小 ÷ 1024 ÷ 1024 ÷ 1024, 1)) + “ GB” .如果真結束 超級列表框1.置標題 (索引, 2, 顯示完成大小) 超級列表框1.置標題 (索引, 3, 顯示文件大小) 超級列表框1.置標題 (索引, 4, 到文本 (到整數 (完成大小 ÷ 文件大小 × 100)) + “%”) 超級列表框1.置標題 (索引, 5, “下載中”) .子程序 _下載按鈕_被單擊 .局部變量 索引, 整數型 .如果真 (輸入編輯框.內容 = “”) 返回 () .如果真結束 下載.下載_多任務 (輸入編輯框.內容, “C:\Users\Administrator\Desktop\” + 取網絡文件名稱 (輸入編輯框.內容), 10, 到整數 (&內部回調)) 計次 = 計次 + 1 索引 = 超級列表框1.插入表項 (, , , , , ) 超級列表框1.置標題 (索引, 0, 到文本 (計次)) 超級列表框1.置標題 (索引, 1, 取網絡文件名稱 (輸入編輯框.內容)) .子程序 程序_Call, 整數型 .參數 子程序地址, 整數型 .參數 參數1, 整數型, 可空 .參數 參數2, 整數型, 可空 .參數 參數3, 整數型, 可空 .參數 參數4, 整數型, 可空 .參數 參數5, 整數型, 可空 .參數 參數6, 整數型, 可空 .參數 參數7, 整數型, 可空 .參數 參數8, 整數型, 可空 .參數 參數9, 整數型, 可空 .參數 參數10, 整數型, 可空 .參數 參數11, 整數型, 可空 .參數 參數12, 整數型, 可空 .參數 參數13, 整數型, 可空 .參數 參數14, 整數型, 可空 .參數 參數15, 整數型, 可空 置入代碼 ({ 86, 190, 15, 0, 0, 0, 141, 77, 8, 141, 76, 241, 252, 139, 65, 4, 133, 192, 116, 2, 255, 49, 78, 131, 233, 8, 133, 246, 117, 239, 255, 85, 8, 94, 201, 194, 124, 0 }) 返回 (0) .子程序 取網絡文件名稱, 文本型 .參數 路徑, 文本型 .局部變量 a, 文本型, , "0" a = 分割文本 (路徑, “/”, ) 返回 (a [取數組成員數 (a)]) .子程序 _標簽1_鼠標左鍵被放開, 邏輯型 .參數 橫向位置, 整數型 .參數 縱向位置, 整數型 .參數 功能鍵狀態, 整數型 置剪輯板文本 (標簽1.標題) 輸入編輯框.內容 = 標簽1.標題 .子程序 _標簽2_鼠標左鍵被放開, 邏輯型 .參數 橫向位置, 整數型 .參數 縱向位置, 整數型 .參數 功能鍵狀態, 整數型 置剪輯板文本 (標簽2.標題) 輸入編輯框.內容 = 標簽2.標題 .子程序 _標簽3_鼠標左鍵被放開, 邏輯型 .參數 橫向位置, 整數型 .參數 縱向位置, 整數型 .參數 功能鍵狀態, 整數型 置剪輯板文本 (標簽3.標題) 輸入編輯框.內容 = 標簽3.標題 .子程序 _暫停按鈕_被單擊 下載.全部暫停 () .子程序 _繼續下載按鈕_被單擊 下載.全部繼續 () .子程序 _停止按鈕_被單擊 下載.全部停止 ()
運行結果:
上述內容就是使用易語言編寫一個多線程多任務下載器,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。