zoukankan      html  css  js  c++  java
  • GDAL库进度信息编写示例

    GDAL进度信息编写

    GDAL库中的算法以及读写数据的时候一般都会提供两个与进度信息相关的参数,下面分别进行描述:

    • GDALProgressFunc pfnProgress
    • void * pProgressArg

    GDALProgressFunc pfnProgress

    GDALProgressFunc pfnProgress这个是一个回调函数,GDALProgressFunc的定义如下所示:

    typedef int (CPL_STDCALL *GDALProgressFunc)(double dfComplete, const char *pszMessage, void *pProgressArg);

    该回调函数接口中共声明了三个参数,分别是:
    - dfComplete 处理进度信息,0~1之间的数字
    - pszMessage 处理进度消息,用于显示在进度控件上
    - pProgressArg 回调函数参数

    void * pProgressArg

    pProgressArg直接会作为回调函数的第三个参数,传入回调函数中。关于这个函数参数的使用请参考我之前的相关博客


    一个简单的进度示例

    /**
    * @brief 示例函数
    * @param pszSrcFile         输入数据
    * @param pszDstFie          输出数据
    * @param pfnProgress        进度信息回调函数
    * @param pProgressArg       进度信息回调函数参数
    * @return                   返回值,处理成功返回CE_None
    */
    CPLErr TestFunction(const char* pszSrcFile,
                        const char* pszDstFile,
                        GDALProgressFunc pfnProgress = NULL,
                        void *  pProgressArg = NULL)    
    {
        // 如果没有指定进度条回调函数,使用GDAL库中的默认回调函数
        if(pfnProgress == NULL)
            pfnProgress = GDALDummyProgress;
    
        // 设置进度信息以及初值为0,可同时设置处理信息
        if(!pfnProgress(0.0, "Start ....", pProgressArg))
        {
            CPLError(CE_Failure, CPLE_UserInterrupt, "User terminated");
            return CE_Failure;
        }
    
        // 一个示例的循环,里面描述了更新进度信息
        for (int i=0; i<100; i++)
        {
            //do something
    
            if(!pfnProgress((i+1.0)/100, "Processing ....", pProgressArg))
            {
                CPLError(CE_Failure, CPLE_UserInterrupt, "User terminated");
                return CE_Failure;
            }
        }
    
        // 处理完成,将进度信息更新为1,可同时设置处理信息
        if(!pfnProgress(1.0, "End ....", pProgressArg))
        {
            CPLError(CE_Failure, CPLErnterrupt, "User terminated");
            retun CE_Failure;
        }
    
        return CE_None;
    }

    在调用时与调用GDAL其他的进度信息一致,下面是一个简单的调用示例:

    void main()
    {
        //进度条回调函数,这里使用GDAL自带的一个控制台进度函数
        GDALProgressFunc pfnProgress = GDALTermProgress;
         //进度条回调函数参数,该参数需与回调函数配合使用
    
        void *  pProgressArg = NULL;    
                    const char *pszSrcFile = "input.tif";
        const char *pszDstFile = "Output.tif";
    
        CPLErr Err = TestFunction(pszSrcFile, pszDstFile, pfnProgress, pProgressArg);
    
        return;
    }
  • 相关阅读:
    SpringMVC运行原理浅析
    JavaEE就业学习路线(给初学者以及自学者一个学习方向)
    Java 教程
    EL表达式
    Java 教程 (Java 对象和类)
    Java 教程(开发环境配置+基础语法)
    简介几种负载均衡原理
    Linux常用命令大全
    Java 数据结构
    Java 包(package)
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313901.html
Copyright © 2011-2022 走看看