7
    QElapsedTimer timer;
    timer.start();

    slowOperation1();

    qDebug() << "The slow operation took" << timer.elapsed() << "milliseconds";

http://doc.qt.io/qt-5/qelapsedtimer.html#invalidate

qDebug()我想停止这个计时器之后。我在那里看不到停止功能,也看不到单发属性。

出路是什么?

4

3 回答 3

12

你不能停下来QElapsedTimer,因为没有计时器。当您调用 methodstart()时,QElapsedTimer保存当前时间。

来自qelapsedtimer_generic.cpp

void QElapsedTimer::start() Q_DECL_NOTHROW
{
    restart();
}

qint64 QElapsedTimer::restart() Q_DECL_NOTHROW
{
    qint64 old = t1;
    t1 = QDateTime::currentMSecsSinceEpoch();
    t2 = 0;
    return t1 - old;
}

经过时,它再次获取当前时间,并计算差异。

qint64 QElapsedTimer::elapsed() const Q_DECL_NOTHROW
{
    return QDateTime::currentMSecsSinceEpoch() - t1;
}

PS 具体实现依赖于平台:WindowsUnixMac

于 2016-05-09T05:58:20.283 回答
1

我需要一个不计算暂停时间的经过计时器,所以这就是我想出的:ElapsedTimer.hpp:

#pragma once

#include <time.h>
#include <cstdio>
#include <cstdint>
#include <cstring>
#include <errno.h>

namespace your_namespace {

class ElapsedTimer {
public:
    ElapsedTimer();
    ~ElapsedTimer();
    
    void Continue();
    void Pause();
    int64_t elapsed_ms();
    
private:
    struct timespec start_ = {};
    int64_t worked_time_ = 0;
    
    /// CLOCK_MONOTONIC_COARSE is faster but less precise
    /// CLOCK_MONOTONIC_RAW is slower but more precise
    const clockid_t clock_type_ = CLOCK_MONOTONIC_RAW;
};
}

ElapsedTimer.cpp:

#include "ElapsedTimer.hpp"

namespace your_namespace {

ElapsedTimer::ElapsedTimer() {}
ElapsedTimer::~ElapsedTimer() {}

inline int64_t GetDiffMs(const timespec &end, const timespec &start) {
    return (end.tv_sec - start.tv_sec) * 1000L + (end.tv_nsec - start.tv_nsec) / 1000000L;
}

void ElapsedTimer::Continue()
{
    int status = clock_gettime(clock_type_, &start_);
    if (status != 0)
        printf("%s", strerror(errno));
}

int64_t ElapsedTimer::elapsed_ms()
{
    const bool paused = (start_.tv_sec == 0 && start_.tv_nsec == 0);
    if (paused)
        return worked_time_;
    
    struct timespec now;
    int status = clock_gettime(clock_type_, &now);
    if (status != 0)
        printf("%s", strerror(errno));
    
    const int64_t extra = GetDiffMs(now, start_);
    return worked_time_ + extra;
}

void ElapsedTimer::Pause() {
    struct timespec now;
    int status = clock_gettime(clock_type_, &now);
    if (status != 0)
        printf("%s", strerror(errno));
    
    worked_time_ += GetDiffMs(now, start_);
    start_ = {};
}
}

用作:

my_namespace::ElapsedTimer timer;
timer.Continue(); // starts recording the amount of time
timer.Pause();// stops recording time
///do something else
timer.Continue();// resumes recording time
/// and at any time call this to find out how many
/// ms passed excluding the paused time:
int64_t passed_ms = timer.elapsed_ms();
于 2021-01-31T04:59:49.370 回答
1

QElapsedTimer 将在所有支持它的平台中使用平台的单调参考时钟。这有一个额外的好处,即 QElapsedTimer 不受时间调整的影响,例如用户更正时间。与 QTime 不同的是,QElapsedTimer 不受时区设置更改的影响,例如夏令时。 https://doc.qt.io/qt-5/qelapsedtimer.html#details

于 2020-08-04T14:39:06.177 回答