2013-06-25 4 views
7

У меня проблема с CURLOPT_MAX_RECV_SPEED_LARGEapi man page.C libcurl, ограничение скорости загрузки - использование процессора идет 100%

Я хочу, чтобы установить максимальную скорость загрузки, поэтому я добавил:

curl_off_t max_speed = 1000*25; 
curl_easy_setopt(curl_handle, CURLOPT_MAX_RECV_SPEED_LARGE, max_speed); 

Но проблема в том, когда он ударил предел (25kb/s) или то, что я создал, использование CPU идет 100%

Я использую его неправильно? Я думаю, потому что я нигде не нашел эту проблему. Я попытался добавить эти две строки в исходный образец кода, но он тоже сошел с ума.

Я использую Windows, и Libcurl V 7.29

Благодаря

Возможное решение было бы написать свой собственный вид сна в функции прогресса, но ...

Вот исходный код "getinmemory.c", с моей 2 добавленных строк:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <curl/curl.h> 

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 


static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void  *userp) 
{ 
    size_t realsize = size * nmemb; 
    struct MemoryStruct *mem = (struct MemoryStruct *)userp; 

    mem->memory =(char*) realloc(mem->memory, mem->size + realsize + 1); 
    if(mem->memory == NULL) { 
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)\n"); 
    return 0; 
    } 

    memcpy(&(mem->memory[mem->size]), contents, realsize); 
    mem->size += realsize; 
    mem->memory[mem->size] = 0; 

    return realsize; 
} 


int main(void) 
{ 
    CURL *curl_handle; 
    CURLcode res; 

    struct MemoryStruct chunk; 

    chunk.memory = (char*)malloc(1); /* will be grown as needed by the realloc  above */ 
    chunk.size = 0; /* no data at this point */ 

    curl_global_init(CURL_GLOBAL_ALL); 

    curl_handle = curl_easy_init(); 

    curl_easy_setopt(curl_handle, CURLOPT_URL,  "http://ns223506.ovh.net/rozne/04e4383e647ce87ce42e73fa00bb0058/wallpaper-812988.jpg"); //Random wallpaper 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

    //My added 2 lines 
    curl_off_t max_speed = 1000*25; // 25kB/s 
    curl_easy_setopt(curl_handle, CURLOPT_MAX_RECV_SPEED_LARGE, max_speed); 


    res = curl_easy_perform(curl_handle); 

    if(res != CURLE_OK) { 
    fprintf(stderr, "curl_easy_perform() failed: %s\n", 
      curl_easy_strerror(res)); 
    } 
    else { 
    printf("%lu bytes retrieved\n", (long)chunk.size); 
    } 

    curl_easy_cleanup(curl_handle); 

    if(chunk.memory) 
    free(chunk.memory); 

    curl_global_cleanup(); 

    return 0; 
} 
+0

@Yve Извините, что я плохо написал, я должен был просто написать 100% просто целое ядро. – pagep

+0

'printf («% lu bytes retrieved \ n », (long) chunk.size);' должно быть '(unsigned long) 'с'% lu' – hit

ответ

3

Ok ПРОБЛЕМА решаемые

Это происходит только в версии завиток-7.29.0-разви-mingw32!

Версии

  • завиток-7.26.0-разви-mingw32
  • завиток-7.31.0-разви-mingw32

ОК

Я проверил еще одну версию перед , но я не копировал dll в правую папку, и я не проверял непосредственно в программе с помощью curl_version(); извините :(

1

Это, казалось бы, быть ISSU e с тем, как вы читаете данные. Ограничивая скорость загрузки, вы, по-видимому, вызываете, что действие загрузки изображения связано с пропускной способностью приема данных. В результате у ЦП нет требуемых данных, и он непрерывно проводит опрос до тех пор, пока он не получит все данные из загрузки.

В таком случае нет ничего, что заставило процесс ждать, пока данные будут спать, поэтому он сидит там, пережевывая CPU.

Смежные вопросы