【问题标题】:Run a function with a delay in QT在 QT 中运行一个有延迟的函数
【发布时间】:2020-09-04 09:20:36
【问题描述】:

我想创建一个函数,比如说 (qDebug()

void MainWindow::my_function()
{
     // Here I need something to make a delay of 2 secs
      qDebug() << "result";
}

有没有一种方法或东西可以等待 2 秒然后执行下一行? 我正在寻找 QT 上最简单的方法。

【问题讨论】:

  • 这能回答你的问题吗? How do I create a pause/wait function using Qt?
  • 如果要阻塞当前线程,QTimer::singleShot()QThread::sleep() 呢?
  • 我不明白这个问题......你想创建一个在什么之后 2 秒被调用的函数?

标签: c++ qt c++11 time delay


【解决方案1】:

我的建议是首先阅读为什么睡眠是一个坏主意,特别是当涉及 GUIS 时。 无论如何,你可以从 qt5 开始

Functions of QThread

void msleep(unsigned long msecs);
void sleep(unsigned long secs);
void usleep(unsigned long usecs);

在您的代码中使用它,您可以这样做

void MainWindow::my_function(){
     // Here I need something to make a delay of 2 secs
     sleep(2);
     qDebug() << "result";
}

但正如我之前所说,请阅读第一条,因为这会起作用,但也会冻结主窗口,考虑到用户体验等,这不是一个好主意

【讨论】:

    【解决方案2】:

    不要(误用)睡眠功能

    睡眠函数是一个非常容易误用的专用工具,而 Qt 为您提供了很多更好的选择。因此,除非您知道自己在做什么(如果只是为了避免养成坏习惯),否则不要使用睡眠功能。

    那么,你有什么选择?

    如果您只想要 2 秒的延迟(例如,在用户按下按钮后),您可以使用 QTimer::singleShot(),它将在计时器到期后调用该函数,例如

    QTimer::singleShot(2000, this, &MainWindow::printResultFunction)
    

    或者您可以使用本地QEventLoop,您将使用exec,然后使用计时器(再次)退出,例如

    QEventLoop loop;
    QTimer::singleShot(2000, &loop, &QEventLoop::quit);
    loop.exec();
    

    或者你可以启动一个单独的线程,它执行你的函数并在这个函数中使用 (gasp) QThread::msleep() 正如我之前所说的睡眠函数是一个专门的工具 - 你知道 你在做什么。您不会停止 GUI 线程和 qt 事件。您正在暂停执行旨在做一件事的线程:做某事,等待 2 秒,再做一些事情并终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-02
      • 2016-03-22
      • 2015-06-23
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多