2011-07-27 76 views
0

我需要幫助C++線程的東西,我已經創建了一個導出函數作爲下載文件(從互聯網上下載文件)的DLL。這個函數輪流創建一個線程來下載文件(用於下載文件的函數是阻塞函數,即URLDownloadToFile,這就是爲什麼我將下載功能放在線程上的原因)。C++線程下載

我想實現以下功能。

  1. 我的調用downloadfile函數不應該阻塞主線程。

  2. 我想一次下載多個文件。

請記住,下載功能是在C++中創建的DLL,這個DLL將在Pascal中使用。

以下是代碼片段:

struct DOWNLOADPARAM 
{ 
    HANDLE hEventStop; 
    TCHAR *szURL; 
    TCHAR *szFilePath; 
}; 


DWORD WINAPI Transfer(void *hw) 
{ 
    Mutex mutex_; 

    DOWNLOADPARAM *const pDownloadParam = static_cast<DOWNLOADPARAM *>(hw); 
    CBSCallbackImpl bsc(NULL, pDownloadParam->hEventStop); 


      const HRESULT hr = ::URLDownloadToFile(NULL,pDownloadParam->szURL ,pDownloadParam->szFilePath,0,&bsc); 


    return 0; 
} 


extern "C" void __declspec(dllexport) downloadfile(TCHAR *url, TCHAR *dest) 
{ 
    Mutex mutex_; 

    DWORD dwThreadId; 
    DOWNLOADPARAM *obj = new DOWNLOADPARAM(); 
    obj->szURL  = url; 
    obj->szFilePath = dest; 


    if((hThread = CreateThread(NULL, 0, Transfer, (LPVOID)obj, 0,&dwThreadId)) != NULL) 
    { 
    } 


// Following code block the thread untill finished 

    WaitForSingleObject(hThread, INFINITE); 
     TerminateThread(hThread, 0); 
    CloseHandle(hThread); 
} 
+3

你應該解釋你有什麼問題。 – sth

+1

你還應該解釋一下你正在用這些'互斥體'做些什麼。我看到你宣佈他們,但我沒有看到你使用它們。 –

+0

正如我所提到的,我真的想從inno腳本(pascal腳本)調用dll下載文件函數。 inno不支持線程或定時器或等待函數,這就是爲什麼我創建一個新的dll文件,將從互聯網異步下載文件。我需要更多的信息/幫助。 – Iqbal

回答

1

它看起來像你的downloadFile功能正在等待下載線程完成它返回之前,這將導致其堵塞就像URLDownloadToFile功能一樣。我建議你把它分解成兩個操作。 downloadFile應該返回某種句柄或事件,調用程序可以使用該句柄或事件來確定操作是否已完成,然後何時提供第二個函數來清理線程和句柄。這樣,調用程序可以繼續運行並使用WaitForMultipleObjects或其他某種機制來允許它執行自己的處理,同時在下載完成時仍會收到通知。我的Win32最好是粗略的,所以我不能真正起草一些示例代碼,但我希望這個設計思路很有幫助。

+0

感謝這個想法真的很有幫助,但正如我所提到的,我想實際調用dll downloadfile函數inno腳本(pascal腳本)。 inno不支持線程或定時器或等待函數,這就是爲什麼我創建一個新的dll文件,將從互聯網異步下載文件。我需要更多的信息.​​..... – Iqbal

+0

在這種情況下,您可以在DLL中使用一個變量來跟蹤操作何時完成,並輪詢查看它何時變爲真。這有點粗糙,你可能不得不同步訪問它,並且你必須小心,如果你一次執行兩次下載或同時運行兩次程序,同一變量不會被共享,但它應該工作。 – qid

+0

該代碼工作完美,我有這個dll代碼的問題是,如果我從dll中刪除等待函數(waitforsingleobject),使此調用爲異步,然後下載不起作爲線程退出,因爲我打電話這個來自Inno腳本的dll函數。我如何實現等待而不阻止呼叫。或者是否有任何其他方式可以下載Internet文件異步。 – Iqbal

0

啓動線程後立即在線程句柄上調用WaitForSingleObject不過是一個同步/阻塞調用。你應該推遲WaitForSingleObject

+0

如何實現這一點,你可以爲我構建一個工作代碼。 – Iqbal

+0

實際上,定時器必須在調用dll的下載文件函數的Inno腳本中實現。但不幸的是inno腳本不支持theads和定時器..所以這就是爲什麼我編碼的c + + DLL來實現這一點。但是來自互聯網的下載文件是同步呼叫,並沒有解決目的。該呼叫應該是異步的。這樣我就可以在dll的後臺線程下載文件,並且還可以在inno腳本安裝程序UI上工作。 – Iqbal