我需要 C++ 线程方面的帮助,我创建了一个 dll,它具有作为下载文件的导出函数(从 Internet 下载文件)。此函数依次创建一个线程来下载文件(用于下载文件的函数是阻塞函数,即 URLDownloadToFile,这就是我将下载功能放在线程上的原因)。
我想实现以下目标。
我对 downloadfile 函数的调用不应阻塞主线程。
我想一次下载多个文件。
记住,下载功能在用 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);
}
最佳答案
看起来您的 downloadFile
函数在返回之前正在等待下载线程完成,这将导致它像 URLDownloadToFile
函数一样阻塞。我建议您将其分为两个操作; downloadFile
应该返回某种句柄或事件,调用程序可以使用它来确定操作是否已完成,然后在完成时提供第二个函数来清理线程和句柄。这样,调用程序可以继续运行并使用 WaitForMultipleObjects 或其他一些机制来允许它执行自己的处理,同时在下载完成时仍会收到通知。我的 Win32 充其量是粗略的,所以我不能真正起草一些示例代码,但我希望设计思想对你有所帮助。
关于C++线程下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843874/