C++线程下载

标签 c++ multithreading

我需要 C++ 线程方面的帮助,我创建了一个 dll,它具有作为下载文件的导出函数(从 Internet 下载文件)。此函数依次创建一个线程来下载文件(用于下载文件的函数是阻塞函数,即 URLDownloadToFile,这就是我将下载功能放在线程上的原因)。

我想实现以下目标。

  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);
}

最佳答案

看起来您的 downloadFile 函数在返回之前正在等待下载线程完成,这将导致它像 URLDownloadToFile 函数一样阻塞。我建议您将其分为两个操作; downloadFile 应该返回某种句柄或事件,调用程序可以使用它来确定操作是否已完成,然后在完成时提供第二个函数来清理线程和句柄。这样,调用程序可以继续运行并使用 WaitForMultipleObjects 或其他一些机制来允许它执行自己的处理,同时在下载完成时仍会收到通知。我的 Win32 充其量是粗略的,所以我不能真正起草一些示例代码,但我希望设计思想对你有所帮助。

关于C++线程下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843874/

相关文章:

c++ - 为什么 std::set_difference 不删除重复项?

c++ - 尝试将结构成员函数传递给 atexit

c# - 线程本地存储和本地方法变量

c++ - 消息循环如何使用线程?

c++ - 检查值是否真的存在于动态数组中? C++

c++ - 是否存在使用 Purify 导致 SIGABRT 在 g++ 中抛出异常的已知问题?

C++ "Best"参数传递方式

java - 将参数传递给 Java 线程

c - 多线程 (C) 程序线程不终止

python - 使用多处理停止 web2py 中长时间运行的操作