Пример #1
0
void ProgressReporter::Done() {
    if (PbrtOptions.quiet) return;
    std::lock_guard<std::mutex> lock(mutex);
    while (plussesPrinted++ < totalPlusses) *curSpace++ = '+';
    fputs(buf, outFile);
    Float seconds = ElapsedMS() / 1000.f;
    fprintf(outFile, " (%.1fs)       \n", seconds);
    fflush(outFile);
}
Пример #2
0
void ProgressReporter::PrintBar() {
    int barLength = TerminalWidth() - 28;
    int totalPlusses = std::max(2, barLength - (int)title.size());
    int plussesPrinted = 0;

    // Initialize progress string
    const int bufLen = title.size() + totalPlusses + 64;
    std::unique_ptr<char[]> buf(new char[bufLen]);
    snprintf(buf.get(), bufLen, "\r%s: [", title.c_str());
    char *curSpace = buf.get() + strlen(buf.get());
    char *s = curSpace;
    for (int i = 0; i < totalPlusses; ++i) *s++ = ' ';
    *s++ = ']';
    *s++ = ' ';
    *s++ = '\0';
    fputs(buf.get(), stdout);
    fflush(stdout);

    std::chrono::milliseconds sleepDuration(250);
    int iterCount = 0;
    while (!exitThread) {
        std::this_thread::sleep_for(sleepDuration);

        // Periodically increase sleepDuration to reduce overhead of
        // updates.
        ++iterCount;
        if (iterCount == 10)
            // Up to 0.5s after ~2.5s elapsed
            sleepDuration *= 2;
        else if (iterCount == 70)
            // Up to 1s after an additional ~30s have elapsed.
            sleepDuration *= 2;

        Float percentDone = Float(workDone) / Float(totalWork);
        int plussesNeeded = std::round(totalPlusses * percentDone);
        while (plussesPrinted < plussesNeeded) {
            *curSpace++ = '+';
            ++plussesPrinted;
        }
        fputs(buf.get(), stdout);

        // Update elapsed time and estimated time to completion
        Float seconds = ElapsedMS() / 1000.f;
        Float estRemaining = seconds / percentDone - seconds;
        if (percentDone == 1.f)
            printf(" (%.1fs)       ", seconds);
        else if (!std::isinf(estRemaining))
            printf(" (%.1fs|%.1fs)  ", seconds,
                   std::max((Float)0., estRemaining));
        else
            printf(" (%.1fs|?s)  ", seconds);
        fflush(stdout);
    }
}
Пример #3
0
void ProgressReporter::Update(int num) {
    if (num == 0 || PbrtOptions.quiet) return;
    std::lock_guard<std::mutex> lock(mutex);
    workDone += num;
    Float percentDone = Float(workDone) / Float(totalWork);
    int plussesNeeded = std::round(totalPlusses * percentDone);
    if (plussesNeeded > totalPlusses) plussesNeeded = totalPlusses;
    while (plussesPrinted < plussesNeeded) {
        *curSpace++ = '+';
        ++plussesPrinted;
    }
    fputs(buf, outFile);
    // Update elapsed time and estimated time to completion
    Float seconds = ElapsedMS() / 1000.f;
    Float estRemaining = seconds / percentDone - seconds;
    if (percentDone == 1.f)
        fprintf(outFile, " (%.1fs)       ", seconds);
    else
        fprintf(outFile, " (%.1fs|%.1fs)  ", seconds,
                std::max((Float)0., estRemaining));
    fflush(outFile);
}