C ++卷曲多执行阻止问题

时间:2018-06-29 00:28:04

标签: c++ curl libcurl

在我的QT应用程序中,我一直在使用curl的curl_easy_setopt,并注意到它实际上是同步的,这阻塞了我的主GUI。在我的应用程序内部,我有一个计时器,该计时器具有一个设置的时间间隔,该时间间隔称为curl。每当我的计时器回调运行curl时,它将阻塞我的应用几秒钟,然后继续执行。因此,现在我试图弄清楚如何执行curl的多接口和异步的多执行,这给了我同样的阻塞/滞后问题。谁能给我建议。

下面是我的代码,以及curl的多用途网站演示。

/********Header Files******/
#include <sys/time.h>
#include <unistd.h>
....

/************My Timer runs the code below every 10 seconds************/  

std::string url = searchEngineParam.toStdString();
std::string userAgent = options[5]->userAgentsOptions[0].toStdString();

CURL *http_handle;
CURLM *multi_handle;
int still_running; /* keep number of running handles */
int repeats = 0;
curl_global_init(CURL_GLOBAL_DEFAULT);
http_handle = curl_easy_init();

curl_easy_setopt(http_handle, CURLOPT_URL, url.c_str());
curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(http_handle,CURLOPT_USERAGENT,userAgent.c_str());
curl_easy_setopt(http_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, (void *)&chunk);
curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

 /* init a multi stack */
 multi_handle = curl_multi_init();

 /* add the individual transfers */
 curl_multi_add_handle(multi_handle, http_handle);

 /* we start some action by calling perform right away */
 curl_multi_perform(multi_handle, &still_running);

 do {
   CURLMcode mc; /* curl_multi_wait() return code */
   int numfds;

   /* wait for activity, timeout or "nothing" */
   mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);

   if(mc != CURLM_OK) {
     fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc);
     break;
   }

   /* 'numfds' being zero means either a timeout or no file descriptors to
      wait for. Try timeout on first occurrence, then assume no file
      descriptors and no file descriptors to wait for means wait for 100
      milliseconds. */

   if(!numfds) {
     repeats++; /* count number of repeated zero numfds */
     if(repeats > 1) {
       WAITMS(100); /* sleep 100 milliseconds */
     }
   }
   else
     repeats = 0;

   curl_multi_perform(multi_handle, &still_running);
 } while(still_running);

 curl_multi_remove_handle(multi_handle, http_handle);

 curl_easy_cleanup(http_handle);

 curl_multi_cleanup(multi_handle);

 curl_global_cleanup();

0 个答案:

没有答案