Esempio n. 1
0
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;
        }
    }
}
Esempio n. 2
0
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));
}