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;
}