GDAL库进度信息编写示例
2024-08-29 00:13:16
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;
}
最新文章
- SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。
- [SharePoint 2013] Set value for people editor with JSOM
- operator->;和operator->;*
- win7下IIS配置以及域名映射方法
- POJ 1654 Area(水题)
- FreeMarker 一二事 - 静态模板的使用与生成
- 高仿bootstrap的layout效果(一)
- Storm系列(三)Topology提交过程
- C程序设计语言练习题1-20
- zoj 2822 Sum of Different Primes (01背包)
- 文件上传<;springmvc>;
- 使用tcpcopy导入线上流量进行功能和压力测试
- Note for ";Some Remarks on Writing Mathematical Proofs";
- LVM : 简介
- Unable to connect to zookeeper server within timeout: 5000
- 状态管理Vuex
- P1758 [NOI2009]管道取珠
- 白月黑羽Python在线教程
- git服务器搭建及eclipse使用git
- Linux用户密码文件/etc/shadow相关
热门文章
- 【webstorm使用手册】如何让webstorm支持nextcss基础语法?
- [NOIp 2016]换教室
- [HNOI2010]MATRIX 矩阵
- 计蒜客NOIP模拟赛(2) D2T2紫色百合
- ●BZOJ 2434: [Noi2011]阿狸的打字机
- 【SYZOI Round1】滑稽的树
- bzoj 2783: [JLOI2012]树
- Luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶_FFT
- Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况
- Python安装与环境变量