void CMACProgressHelper::UpdateProgress(unsigned int nCurrentStep, bool bForceUpdate) { // update the step if (nCurrentStep == -1) m_nCurrentStep++; else m_nCurrentStep = nCurrentStep; // figure the percentage done float fPercentageDone = float(m_nCurrentStep) / float(ape_max(m_nTotalSteps, 1)); int nPercentageDone = (int) (fPercentageDone * 1000 * 100); if (nPercentageDone > 100000) nPercentageDone = 100000; // fire the callback if (m_pProgressCallback != NULL) { if (bForceUpdate || (nPercentageDone - m_nLastCallbackFiredPercentageDone) >= 1000) { m_pProgressCallback->Progress(nPercentageDone); m_nLastCallbackFiredPercentageDone = nPercentageDone; } } }
int ape_timers_process(ape_global *ape_ctx) { ape_timers *timers = &ape_ctx->timersng; ape_timer_t *cur = timers->head; uint64_t inums = UINT64_MAX, lastsample = 0; process_async(timers); /* TODO: paused timer */ while (cur != NULL) { uint64_t start; if (cur->flags & APE_TIMER_IS_CLEARED) { cur = ape_timer_destroy(timers, cur); continue; } if ((start = mach_absolute_time()) >= cur->schedule - 150000) { uint64_t ret; unsigned int duration; ret = cur->callback(cur->arg); // printf("Timer returned %lld\n", ret); if (ret == -1) { cur->schedule = start + cur->ticks_needs; } else if (ret == 0) { cur = ape_timer_destroy(timers, cur); continue; } else { cur->ticks_needs = ret * 1000000; cur->schedule = start + cur->ticks_needs; } lastsample = mach_absolute_time(); duration = lastsample - start; if (cur->stats.max < duration / 1000000) { cur->stats.max = duration / 1000000; } if (cur->stats.min == 0 || duration / 1000000 < cur->stats.min) { cur->stats.min = duration / 1000000; } cur->stats.nexec++; cur->stats.totaltime += duration / 1000000; } if (cur->schedule < inums) { inums = cur->schedule; } cur = cur->next; } process_async(timers); if (inums == UINT64_MAX) { return APE_TIMER_RESOLUTION; } if (lastsample == 0) { lastsample = mach_absolute_time(); } // printf("Next timer in : %lld or %d\n", inums-lastsample, ape_max(1, // (int)((inums-lastsample+500000)/1000000))); return ape_max((timers->run_in_low_resolution ? 100 : 1), (int)((inums - lastsample + 500000) / 1000000)); }