我编写了一个调用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
答案 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
的两个超时事件。
尽管我一开始就说过-行为不确定。