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