关于QTimer :: singleShot的一个陌生问题

时间:2019-07-27 11:54:32

标签: qt

我编写了一个调用QTimer :: singleShot的函数,以确保它不超时。但是我得到了一个陌生的结果。

int Test(int x)
{
    QEventLoop loop;

    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&](){
        loop.exit(x);
    });
    timer.start(7000);

    QTimer::singleShot(10000, std::bind(&QEventLoop::exit, &loop, 3));

    return loop.exec();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    qDebug() << Test(1) << endl;
    qDebug() << Test(2) << endl;

    return a.exec();
}

我希望输出为 1个 2 但实际输出是 1个 3

1 个答案:

答案 0 :(得分:1)

看起来像未定义的行为。关于为什么,您可能会看到上述症状,请考虑实施double? ...

Test

您构造一个本地int Test(int x) { QEventLoop loop; QTimer timer; QObject::connect(&timer, &QTimer::timeout, [&](){ loop.exit(x); }); timer.start(7000); QTimer::singleShot(10000, std::bind(&QEventLoop::exit, &loop, 3)); return loop.exec(); } 。然后,您设置两个计时器回调(分别在7s和10s之后),使它们退出本地事件循环。第一次超时将退出循环,导致QEventLoop完成并返回。但是仍然有一个超时未决,这还将尝试退出现在无效的Test。当您再次以QEventLoop的名称调用Test时,很可能在与先前调用Test(2)相同的地址处构造新的QEventLoop。最终结果是尚待处理的超时使用的Test地址变为``有效''。因此,您看到的两个值实际上来自调用QEventLoop的两个超时事件。

尽管我一开始就说过-行为不确定。