Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Libcurl进程回调无法使用多线程 我试图用C++中的LIbCURL管理下载的进度。 我用curl_-easy成功地做到了这一点,但是curl_-easy的问题是它会在请求发出之前阻止程序_C++_Libcurl - Fatal编程技术网

Libcurl进程回调无法使用多线程 我试图用C++中的LIbCURL管理下载的进度。 我用curl_-easy成功地做到了这一点,但是curl_-easy的问题是它会在请求发出之前阻止程序

Libcurl进程回调无法使用多线程 我试图用C++中的LIbCURL管理下载的进度。 我用curl_-easy成功地做到了这一点,但是curl_-easy的问题是它会在请求发出之前阻止程序,c++,libcurl,C++,Libcurl,我需要使用curl\u mutli,以便http请求是异步的,但是当我尝试更改为curl\u multi时,我的进度函数停止工作 我有以下简单的请求代码: int progressFunc(void* p, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded) { std::cout << TotalToDownload << ", " <

我需要使用curl\u mutli,以便http请求是异步的,但是当我尝试更改为curl\u multi时,我的进度函数停止工作

我有以下简单的请求代码:

int progressFunc(void* p, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded) {
    std::cout << TotalToDownload << ", " << NowDownloaded << std::endl;
    return 0;
}

FILE* file = std::fopen(filePath.c_str(), "wb");

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);

curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progressFunc);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);

CURLcode res = curl_easy_perform(curl);

TL;DR:您应该在循环中调用
curl\u multi\u perform
。如果您不使用事件循环和poll/epoll,您可能应该坚持在单独的线程中使用
curl\u easy


curl_multi_API的全部要点不是阻塞:您可以使用或类似的方法来监视curl的非阻塞套接字,并在每次从网络收到数据时调用
curl_multi_perform
,而不是在一次调用中神奇地下载整个文件。当您使用它的多模式时,curl本身不会启动任何内部线程,也不会监视它的套接字—您应该自己来做。这允许编写高性能的事件循环,在同一线程中同时运行多个curl传输。需要的人通常已经有了必要的工具,或者可以自己轻松地编写

第一次调用
curl\u multi\u perform
时,它很可能在DNS解析完成和/或远程端接受TCP连接之前返回。因此,在第一次呼叫中传输的有效负载数据量实际上将为0。根据服务器配置,第二次调用可能也不会传输任何有效负载。“有效负载”是指实际的应用程序数据(与DNS请求、SSL协商、HTTP头和HTTP2帧元数据相反)

要真正完成传输,您必须反复调用epoll\u wait、curl\u multi\u perform和许多其他函数,直到完成为止。完成一次传输后停止,但在实践中,创建一个永久运行的线程更为有益,该线程在应用程序的生命周期内处理所有HTTP传输

FILE* file = std::fopen(filePath.c_str(), "wb");

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);

curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progressFunc);

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
curl_multi_add_handle(curlm, curl);

int runningHandles;
CURLMcode res = curl_multi_perform(curlm, &runningHandles);