1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| /************************************************************************/
/* GDALTermProgress() */
/************************************************************************/
/**
* \brief Simple progress report to terminal.
*
* This progress reporter prints simple progress report to the
* terminal window. The progress report generally looks something like
* this:
\verbatim
0...10...20...30...40...50...60...70...80...90...100 - done.
\endverbatim
* Every 2.5% of progress another number or period is emitted. Note that
* GDALTermProgress() uses internal static data to keep track of the last
* percentage reported and will get confused if two terminal based progress
* reportings are active at the same time.
*
* The GDALTermProgress() function maintains an internal memory of the
* last percentage complete reported in a static variable, and this makes
* it unsuitable to have multiple GDALTermProgress()'s active eithin a
* single thread or across multiple threads.
*
* @param dfComplete completion ratio from 0.0 to 1.0.
* @param pszMessage optional message.
* @param pProgressArg ignored callback data argument.
*
* @return Always returns TRUE indicating the process should continue.
*/
int CPL_STDCALL GDALTermProgress( double dfComplete, const char *pszMessage,
void * pProgressArg )
{
static int nLastTick = -1;
int nThisTick = (int) (dfComplete * 40.0);
(void) pProgressArg;
nThisTick = MIN(40,MAX(0,nThisTick));
// Have we started a new progress run?
if( nThisTick < nLastTick && nLastTick >= 39 )
nLastTick = -1;
if( nThisTick <= nLastTick )
return TRUE;
while( nThisTick > nLastTick )
{
nLastTick++;
if( nLastTick % 4 == 0 )
fprintf( stdout, "%d", (nLastTick / 4) * 10 );
else
fprintf( stdout, "." );
}
if( nThisTick == 40 )
fprintf( stdout, " - done.\n" );
else
fflush( stdout );
return TRUE;
} |
Partager