gpt4 book ai didi

c++ - 使用 Lambda 和递归函数调用了解 QTimer

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:42 25 4
gpt4 key购买 nike

我有以下代码:

void class::Testfunc()
{
QTimer* timer = new QTimer;
QObject::connect(timer, &QTimer::timeout, [this](){
emit Log("Time out...");
TestFunc(serverAddress, requestsFolderPath);
// deleteLater(); //*** why does this crash if used to replace the connect below?
});
connect(timer, &QTimer::timeout, timer, &QTimer::deleteLater);
timer->setSingleShot(true);
timer->start(1000);
}

使用连接到 lambda 函数的超时创建单次计时器,该函数每秒记录 lambda 函数的入口(将文本打印到标准输出)并再次调用该函数。

这没有问题。但是,如果我删除对 deleteLater 的连接调用(在 lambda 函数下方),但在 lambda 函数中启用 deleteLater 调用,该函数将失败。它打印一次,不久之后,在尝试删除计时器对象时崩溃。

此实例中的两个 deleteLater 调用之间有什么区别,为什么将 deleteLater 放在 lambda 函数中会导致此处出现问题,而创建单独的连接会按预期工作,即使两者都调用 deleteLater 以响应计时器的超时信号?

最佳答案

鉴于没有拼写错误或一些我不知道的信息,我认为原因是因为您试图稍后删除您的 class 实例而不是 QTimer 在上述方法中在堆上分配的实例。

如果您查看非 lambda 版本,它会在 QTimer 实例 上调用 deleteLater,因为它是连接调用中的接收者。

connect(timer, &QTimer::timeout, timer, &QTimer::deleteLater);

然而,在 lambda 变体中,计时器实例未被捕获,自然地,在其当前版本中将无法访问它。为了使这两个替代方案等效,需要对代码进行此修改:

QObject::connect(timer, &QTimer::timeout, [this, timer](){
// ^^^^^
emit Log("Time out...");
TestFunc(serverAddress, requestsFolderPath);
timer->deleteLater();
// ^^^^^^^
});

关于c++ - 使用 Lambda 和递归函数调用了解 QTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26713879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com