00001 #include <eh_utils.h>
00002
00003 gpointer print_status( gpointer data );
00004
00005 Eh_status_bar*
00006 eh_status_bar_new( double* cur , double* end )
00007 {
00008 Eh_status_bar* status_bar = eh_new( Eh_status_bar , 1 );
00009
00010 status_bar->cur = cur;
00011 status_bar->end = end;
00012 status_bar->status = EH_STATUS_BAR_RUNNING;
00013 status_bar->timer = g_timer_new();
00014 status_bar->mutex = g_mutex_new();
00015
00016 status_bar->t = g_thread_create( print_status , status_bar , TRUE , NULL );
00017
00018 return status_bar;
00019 }
00020
00021 Eh_status_bar*
00022 eh_status_bar_stop( Eh_status_bar* b )
00023 {
00024 g_mutex_lock( b->mutex );
00025 b->status = EH_STATUS_BAR_STOPPED;
00026 g_mutex_unlock( b->mutex );
00027
00028 return b;
00029 }
00030
00031 Eh_status_bar*
00032 eh_status_bar_pause( Eh_status_bar* b )
00033 {
00034 g_mutex_lock( b->mutex );
00035 b->status = EH_STATUS_BAR_PAUSED;
00036 g_mutex_unlock( b->mutex );
00037 return b;
00038 }
00039
00040 gboolean
00041 eh_status_bar_is_stopped( Eh_status_bar* b )
00042 {
00043 gboolean is_stopped;
00044
00045 g_mutex_lock( b->mutex );
00046 is_stopped = (b->status == EH_STATUS_BAR_STOPPED);
00047 g_mutex_unlock( b->mutex );
00048
00049 return is_stopped;
00050 }
00051
00052 Eh_status_bar*
00053 eh_status_bar_destroy( Eh_status_bar* b )
00054 {
00055 eh_status_bar_stop( b );
00056
00057 g_thread_join( b->t );
00058
00059 g_timer_destroy( b->timer );
00060 g_mutex_free ( b->mutex );
00061 eh_free( b );
00062
00063 return NULL;
00064 }
00065
00066 gpointer
00067 print_status( gpointer data )
00068 {
00069 Eh_status_bar* b = (Eh_status_bar*)data;
00070 double t;
00071 double eta;
00072 gchar* t_str;
00073 gchar* eta_str;
00074 gchar* status_bar[] = { "." , "o" , "0" , "O" , NULL };
00075 gchar** p = status_bar;
00076
00077 fprintf( stderr , "\n" );
00078 fprintf( stderr , " Current | Elapsed | ETA \n" );
00079
00080 for ( ; *(b->cur)<=0 && !eh_status_bar_is_stopped(b) ; );
00081
00082 for ( ; !eh_status_bar_is_stopped(b) ; )
00083 {
00084 t = g_timer_elapsed(b->timer,NULL);
00085 eta = t / *(b->cur) * ( *(b->end) - *(b->cur) );
00086
00087 if ( *p==NULL )
00088 p = status_bar;
00089
00090 if ( b->status==EH_STATUS_BAR_RUNNING )
00091 {
00092 t_str = eh_render_time_str( t );
00093 eta_str = eh_render_time_str( eta );
00094
00095 fprintf( stderr , " %7g (%3.0f%%) | %s | %s" ,
00096 *(b->cur) , *(b->cur) / *(b->end)*100. , t_str , eta_str );
00097
00098 fprintf( stderr , " (%s)" , *p );
00099 fprintf( stderr , " \r" );
00100
00101 eh_free( eta_str );
00102 eh_free( t_str );
00103 }
00104
00105 p++;
00106
00107 g_usleep( 100000 );
00108 }
00109
00110 t_str = eh_render_time_str( g_timer_elapsed(b->timer,NULL) );
00111
00112 fprintf( stderr , "\n" );
00113
00114 fprintf( stderr , "Elapsed time: %s\n" , t_str );
00115
00116 eh_free( t_str );
00117
00118 return data;
00119 }
00120
00121 #define EH_SECONDS_PER_DAY ( 86400. )
00122 #define EH_SECONDS_PER_HOUR ( 3600. )
00123 #define EH_SECONDS_PER_MINUTE ( 60. )
00124
00125 gchar*
00126 eh_render_time_str( double sec )
00127 {
00128 gchar* str = NULL;
00129
00130 {
00131 gint d = sec / (gint)EH_SECONDS_PER_DAY;
00132 gint h = sec / (gint)EH_SECONDS_PER_HOUR;
00133 gint m = sec / (gint)EH_SECONDS_PER_MINUTE;
00134 gint s = fmod( sec , 60. );
00135
00136 str = g_strdup_printf( "%02d:%02d:%02d:%02d" , d , h , m , s );
00137 }
00138
00139 return str;
00140 }
00141