[Métodos de atraso do Qt] Vários métodos para implementar atraso e suspensão no Qt


Capítulo 1: Métodos básicos para implementar atraso e suspensão no Qt

1.1 Uso de QThread

QThreadÉ a classe básica usada para programação multithread em Qt. Nesta classe, existe um método muito útil chamado msleep, que pode ser usado para implementar um atraso no thread atual.

exemplo de código

#include <QThread>

void delayFunction() {
    
    
    QThread::msleep(1000);  // 延迟1000毫秒,即1秒
}

Aqui QThread::msleep(1000);fará com que o thread atual seja pausado por 1 segundo. Este é um atraso de bloqueio, o que significa que bloqueia a execução do thread atual.

1.2 Uso do QTimer

QTimerÉ outra classe usada para implementar tarefas atrasadas e agendadas. Ao contrário QThread, QTimernão é bloqueador.

exemplo de código

#include <QTimer>
#include <QObject>

class MyClass : public QObject {
    
    
    Q_OBJECT
public slots:
    void mySlot() {
    
    
        // 执行延迟后的操作
    }
};

// 在某个函数中
MyClass obj;
QTimer::singleShot(1000, &obj, SLOT(mySlot()));  // 1秒后执行mySlot

Aqui, QTimer::singleShoto método irá acionar o método após 1 segundo mySlotsem bloquear o thread atual.

1.3 Uso de QElapsedTimer

QElapsedTimeré uma classe usada para medir o tempo decorrido. É comumente usado para análise de desempenho.

exemplo de código

#include <QElapsedTimer>

QElapsedTimer timer;
timer.start();

// 执行某些操作

qint64 elapsed = timer.elapsed();  // 获取经过的时间(毫秒)

1.4 Uso de QDateTime

QDateTimeA classe fornece funções de data e hora e também pode ser usada para implementar atrasos.

exemplo de código

#include <QDateTime>
#include <QCoreApplication>

void delay(int msec) {
    
    
    QDateTime dieTime = QDateTime::currentDateTime().addMSecs(msec);
    while (QDateTime::currentDateTime() < dieTime) {
    
    
        QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    }
}

Aqui, usamos QDateTime::currentDateTime().addMSecs(msec)para obter o tempo de atraso e, em seguida, usamos um loop para esperar.

Como Bjarne Stroustrup disse em "The C++ Programming Language": "C++ é uma linguagem de programação multiparadigma que suporta diferentes estilos de programação." [1] No Qt, esses diferentes métodos de atraso e suspensão são manifestações de ideias de programação multiparadigma.

Capítulo 2: Diferenças entre Qt5 e Qt6

2.1 Diferenças no QThread

No Qt5 e no Qt6, QThreadas funções básicas são praticamente as mesmas. No entanto, o Qt6 introduz algumas novas APIs e melhorias que tornam a programação multithread mais conveniente.

exemplo de código

Uso no Qt5 QThread:

QThread thread;
Worker worker;

worker.moveToThread(&thread);
connect(&thread, SIGNAL(started()), &worker, SLOT(doWork()));
thread.start();

Uso no Qt6 QThread:

QThread thread;
Worker worker;

worker.moveToThread(&thread);
connect(&thread, &QThread::started, &worker, &Worker::doWork);  // 使用新的信号和槽语法
thread.start();

No Qt6, a forma como os sinais e slots são conectados foi melhorada, tornando o código mais claro.

2.2 Diferenças no QTimer

QTimerAlgumas pequenas melhorias foram feitas no Qt6, mas o uso básico permanece o mesmo.

exemplo de código

O uso no Qt5 e Qt6 QTimeré basicamente o mesmo:

QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(update()));
timer.start(1000);

2.3 Diferenças entre QElapsedTimer e QDateTime

Não há diferença significativa entre essas duas classes no Qt5 e no Qt6. Ambos são usados ​​para medição de tempo e atraso, e a API permanece basicamente a mesma.

2.4 Resumo

O Qt6 tem algumas melhorias e otimizações em relação ao Qt5, mas a maioria das classes e métodos usados ​​para atraso e hibernação permanecem os mesmos. Isso significa que a migração do Qt5 para o Qt6 geralmente é tranquila e não requer grandes alterações de código.

Como uma celebridade disse uma vez: “O tempo é a mais valiosa de todas as riquezas.” [2] No desenvolvimento de software, o controle preciso do tempo é crucial, e o Qt consegue isso fornecendo uma variedade de métodos.

Capítulo 3: Implementação de baixo nível no Linux

3.1 A implementação subjacente do QThread no Linux

Nos sistemas Linux, QThreada implementação subjacente é baseada em threads POSIX (também conhecidos como Pthreads). QThread::msleep()O método é na verdade um wrapper em torno da chamada do sistema nanosleepor usleep.

código-fonte subjacente

Em algumas distribuições Linux, essa funcionalidade é implementada na função qthread_unix.cppdo arquivo QThread::msleep.

void QThread::msleep(unsigned long msecs)
{
    
    
    struct timespec ts = {
    
     msecs / 1000, (msecs % 1000) * 1000 * 1000 };
    nanosleep(&ts, NULL);
}

3.2 QTimer在Linux下的底层实现

QTimer 在Linux下通常使用时间戳或者Linux的定时器机制(例如 timerfd)进行实现。

底层源码

在Linux系统中,QTimer 的实现通常位于 qtimer_linux.cpp 文件中。

// 示例代码,展示timerfd的使用
int timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);

3.3 QElapsedTimer和QDateTime在Linux下的底层实现

QElapsedTimer 在Linux下通常使用 clock_gettime 函数。而 QDateTime 则通常使用 gettimeofdaytime 函数。

底层源码

在Linux系统中,这些功能的实现通常位于 qelapsedtimer_unix.cppqdatetime_unix.cpp 文件中。

// QElapsedTimer 使用 clock_gettime
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);

// QDateTime 使用 gettimeofday
struct timeval tv;
gettimeofday(&tv, NULL);

第四章:方法对比与使用建议

4.1 QThread vs QTimer vs QElapsedTimer vs QDateTime

这几种方法各有优缺点,选择哪一种取决于具体的应用场景。

  • QThread:适用于需要长时间运行或需要并行处理的任务。
  • QTimer:适用于需要定时触发某个事件或函数的场景。
  • QElapsedTimer:适用于需要精确测量时间间隔的场景。
  • QDateTime:适用于需要处理日期和时间的场景。

4.2 何时使用哪种方法

  • 需要并行处理任务:使用QThread。
  • 需要定时触发事件:使用QTimer。
  • 需要精确测量时间:使用QElapsedTimer。
  • 需要处理日期和时间:使用QDateTime。

4.3 在不同版本和操作系统下的注意事项

  • 在Qt5和Qt6之间迁移时,注意API的微小变化。
  • 在Linux系统下,了解底层实现可以帮助你更有效地使用这些方法。

4.4 总结与建议

选择合适的方法不仅可以提高代码的效率,还可以使代码更易于维护。正如一位名人曾说:“选择是一种能力,也是一种责任。”[4]

在编程中,合理地选择延迟和休眠的方法,就像在生活中做出明智的选择一样,都是至关重要的。

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页
在这里插入图片描述

Acho que você gosta

Origin blog.csdn.net/qq_21438461/article/details/132916934
Recomendado
Clasificación