zoukankan      html  css  js  c++  java
  • libcurl开源库在Win32程序中使用下载文件显示进度条实例

    一、配置工程引用libcurl库

    #define CURL_STATICLIB
    
    #include "curl/curl.h"
    
    #ifdef _DEBUG
    #pragma comment(lib,"lib\Debug\libcurld.lib")
    #else
    #pragma comment(lib,"lib\Release\libcurl.lib")
    #endif

    头文件文件夹放到工程目录下

    二、初始化函数

    1.CURLcode curl_global_init(long flags);

    描述:
    这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
    如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
    注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
    参数:flags
    CURL_GLOBAL_ALL //初始化所有的可能的调用。
    CURL_GLOBAL_SSL //初始化支持 安全套接字层。
    CURL_GLOBAL_WIN32 //初始化win32套接字库。
    CURL_GLOBAL_NOTHING //没有额外的初始化。
     
    这个函数在主线程初始化时调用
     
     
    2 void curl_global_cleanup(void);
    描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
    注意:虽然libcurl是线程安全的,但curl_global_cleanup是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程
     
    这个函数在主线程销毁时调用
     
    3 CURL *curl_easy_init( );
    描述:
    curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup函数清理.
    一般curl_easy_init意味着一个会话的开始. 它会返回一个easy_handle(CURL*对象), 一般都用在easy系列的函数中
     
    4 void curl_easy_cleanup(CURL *handle);
    描述:
    这个调用用来结束一个会话.与curl_easy_init配合着用.
    参数:CURL类型的指针
     
     
    在下载线程函数里
    void CDownloadFileThread::DoTask()
    {
      ......
       
     

      CURL *curl;
      CURLcode res;
      FILE *outfile;

         char *progress_data = "*";//给回调函数传参数

         curl = curl_easy_init();
         if(curl)
        {
      outfile = fopen("test.txt", "wb");

      curl_easy_setopt(curl, CURLOPT_URL,"http://10.10.1.4/d/c00000000000039/2017-4-22/test.txt");

      curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);
      curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
      curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
      curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, (LPTSTR)CommonUtils::UnicodeToANSI(m_strPiID.GetBuffer()).c_str());

      res = curl_easy_perform(curl);

      fclose(outfile);
      /* always cleanup */
      curl_easy_cleanup(curl);
      }

      
      ......
    }
     
    下载回调函数声明

    //这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的
    //完成数据保存功能
    static size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream);

    //这个函数是为了符合CURLOPT_PROGRESSFUNCTION而构造的
    //显示文件传输进度,t代表文件大小,d代表传 输已经完成部分
    static int my_progress_func(void *ptr,double t, /* dltotal */double d, /* dlnow */double ultotal,double ulnow);

    size_t CDownloadFileThread::my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
    {
    return fwrite(ptr, size, nmemb, stream);
    }

    int CDownloadFileThread::my_progress_func(char *progress_data,
    double t, /* dltotal */
    double d, /* dlnow */
    double ultotal,
    double ulnow)
    {
    //printf("%s %g / %g (%g %%) ", progress_data, d, t, d*100.0/t);

    //SendMessage 发送显示
    return 0;
    }

  • 相关阅读:
    三层架构和MVC模型的常识
    iOS开发之Auto Layout入门
    js-innerHTML
    $(document).ready() 与window.onload的差别
    java jsp+servlet+mysql实现登录网页设计
    ASCII码表
    表单的提交onsubmit事件
    谋哥:社交小游戏App将是下一个金矿!
    各种表
    vue elementui table 双击单元格实现编辑,聚焦,失去焦点,显示隐藏input和span
  • 原文地址:https://www.cnblogs.com/chechen/p/6755778.html
Copyright © 2011-2022 走看看