static void hb_gt_std_Tone( PHB_GT pGT, double dFrequency, double dDuration ) { double dCurrentSeconds; PHB_GTSTD pGTSTD; HB_TRACE(HB_TR_DEBUG, ("hb_gt_std_Tone(%p,%lf,%lf)", pGT, dFrequency, dDuration)); pGTSTD = HB_GTSTD_GET( pGT ); /* Output an ASCII BEL character to cause a sound */ /* but throttle to max once per second, in case of sound */ /* effects prgs calling lots of short tone sequences in */ /* succession leading to BEL hell on the terminal */ dCurrentSeconds = hb_dateSeconds(); if( dCurrentSeconds < pGTSTD->dToneSeconds || dCurrentSeconds - pGTSTD->dToneSeconds > 0.5 ) { hb_gt_std_termOut( pGTSTD, s_szBell, 1 ); pGTSTD->dToneSeconds = dCurrentSeconds; } HB_SYMBOL_UNUSED( dFrequency ); /* convert Clipper (DOS) timer tick units to seconds ( x / 18.2 ) */ hb_idleSleep( dDuration / 18.2 ); }
/* RUN all tasks defined in background state but only if SET BACKGROUND TASKS is ON*/ void hb_backgroundRun( void ) { PHB_BACKGROUNDTASK pBkgTask; if( ! s_bIamBackground && s_bEnabled ) { s_bIamBackground = HB_TRUE; if( s_uiBackgroundTask < s_uiBackgroundMaxTask ) { double dCurrSeconds = hb_dateSeconds(); pBkgTask = ( PHB_BACKGROUNDTASK ) s_pBackgroundTasks[ s_uiBackgroundTask ]; /* check if hb_dateSeconds() is lower than pBkgTask->dSeconds, if so midnight is reached */ if( ! ( pBkgTask->dSeconds ) || dCurrSeconds < pBkgTask->dSeconds ) pBkgTask->dSeconds = dCurrSeconds; /* Check if a task can run */ if( pBkgTask->bActive && ( pBkgTask->millisec == 0 || ( ( ( hb_dateSeconds() - pBkgTask->dSeconds ) * 1000 ) >= pBkgTask->millisec ) ) ) { hb_itemRelease( hb_itemDo( pBkgTask->pTask, 0 ) ); pBkgTask->dSeconds = hb_dateSeconds(); } ++s_uiBackgroundTask; } else { if( s_uiBackgroundMaxTask && s_uiBackgroundTask == s_uiBackgroundMaxTask ) s_uiBackgroundTask = 0; } s_bIamBackground = HB_FALSE; } }
HB_ULONG hb_backgroundAddFunc( PHB_ITEM pBlock, int nMillisec, HB_BOOL bActive ) { PHB_BACKGROUNDTASK pBkgTask; /* store a copy of passed codeblock */ pBkgTask = ( PHB_BACKGROUNDTASK ) hb_xgrab( sizeof( HB_BACKGROUNDTASK ) ); pBkgTask->pTask = hb_itemNew( pBlock ); pBkgTask->dSeconds = hb_dateSeconds(); pBkgTask->millisec = nMillisec; pBkgTask->bActive = bActive; if( ! s_pBackgroundTasks ) { pBkgTask->ulTaskID = s_ulBackgroundID = 1; s_pBackgroundTasks = ( PHB_BACKGROUNDTASK * ) hb_xgrab( sizeof( HB_BACKGROUNDTASK ) ); } else { pBkgTask->ulTaskID = ++s_ulBackgroundID; if( pBkgTask->ulTaskID == 0 ) /* the counter reach maximum value */ { /* find unique task ID and set the counter for next */ int iTask = 0; while( iTask < s_uiBackgroundMaxTask ) { if( s_pBackgroundTasks[ iTask ]->ulTaskID == pBkgTask->ulTaskID ) { pBkgTask->ulTaskID++; /* This list is unsorted so we have to scan from the begining again */ iTask = 0; } else { iTask++; if( s_ulBackgroundID < pBkgTask->ulTaskID ) s_ulBackgroundID = pBkgTask->ulTaskID; } } } s_pBackgroundTasks = ( PHB_BACKGROUNDTASK * ) hb_xrealloc( s_pBackgroundTasks, sizeof( HB_BACKGROUNDTASK ) * ( s_uiBackgroundMaxTask ) ); } s_pBackgroundTasks[ s_uiBackgroundMaxTask ] = pBkgTask; ++s_uiBackgroundMaxTask; return pBkgTask->ulTaskID; }
double hb_secondsCPU( int n ) { double d = 0.0; #if defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE ) && ! defined( HB_OS_UNIX ) FILETIME Create, Exit, Kernel, User; #endif #if defined( HB_OS_OS2 ) static ULONG s_timer_interval = 0; QSGREC ** pBuf; #endif if( ( n < 1 || n > 3 ) && ( n < 11 || n > 13 ) ) n = 3; #if defined( HB_OS_UNIX ) && ! defined( HB_OS_VXWORKS ) { struct tms tm; times( &tm ); if( n > 10 ) { n -= 10; if( n & 1 ) d += tm.tms_cutime; if( n & 2 ) d += tm.tms_cstime; } if( n & 1 ) d += tm.tms_utime; if( n & 2 ) d += tm.tms_stime; /* In POSIX-1996 the CLK_TCK symbol is mentioned as obsolescent */ #if 0 d /= CLK_TCK; #endif d /= ( double ) sysconf( _SC_CLK_TCK ); } #else if( n > 10 ) n -= 10; #if defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE ) if( hb_iswinnt() && GetProcessTimes( GetCurrentProcess(), &Create, &Exit, &Kernel, &User ) ) { if( n & 1 ) { d += ( double ) ( ( ( HB_MAXINT ) User.dwHighDateTime << 32 ) + ( HB_MAXINT ) User.dwLowDateTime ); } if( n & 2 ) { d += ( double ) ( ( ( HB_MAXINT ) Kernel.dwHighDateTime << 32 ) + ( HB_MAXINT ) Kernel.dwLowDateTime ); } d /= 10000000.0; } else #elif defined( HB_OS_OS2 ) if( s_timer_interval == 0 ) DosQuerySysInfo( QSV_TIMER_INTERVAL, QSV_TIMER_INTERVAL, ( PVOID ) &s_timer_interval, sizeof( ULONG ) ); pBuf = ( QSGREC ** ) hb_xalloc( BUFSIZE ); if( pBuf ) { #if defined( __GNUC__ ) APIRET rc = DosQuerySysState( QS_PROCESS, 0L, _getpid(), 0L, pBuf, BUFSIZE ); #else APIRET rc = DosQuerySysState( QS_PROCESS, 0L, getpid(), 0L, pBuf, BUFSIZE ); #endif if( rc == NO_ERROR ) { QSGREC * pGrec = *pBuf; QSPREC * pPrec = ( QSPREC * ) ( ( ULONG ) pGrec + sizeof( QSGREC ) ); QSTREC * pTrec = pPrec->pThrdRec; int i; for( i = 0; i < pPrec->cTCB; i++, pTrec++ ) { if( n & 1 ) d += pTrec->usertime; if( n & 2 ) d += pTrec->systime; } d = d * 10.0 / s_timer_interval; } hb_xfree( pBuf ); } else #endif { /* TODO: this code is only for DOS and other platforms which cannot calculate process time */ if( n & 1 ) d = hb_dateSeconds(); } #endif return d; }