c – 为什么Timer工作了很多次,即使我设置了repeat = false?

c – 为什么Timer工作了很多次,即使我设置了repeat = false?,第1张

概述我想设置800ms的延迟时间来运行一个函数,所以我用一个计时器来处理它.代码如下.但是我发现,第一次,函数运行正常,它只显示一个console.log(“这里是控制台…..”); ,但是当我再次点击它时,它显示2个控制台,在第三次点击时,它显示3个控制台,依此类推…… 我无法理解为什么会发生这种情况,任何朋友都可以为我解释一下吗? import QtQuick 2.6import QtQuick 我想设置800ms的延迟时间来运行一个函数,所以我用一个计时器来处理它.代码如下.但是我发现,第一次,函数运行正常,它只显示一个console.log(“这里是控制台…..”);,但是当我再次点击它时,它显示2个控制台,在第三次点击时,它显示3个控制台,依此类推……

我无法理解为什么会发生这种情况,任何朋友都可以为我解释一下吗?

import QtQuick 2.6import QtQuick.Window 2.2Window {    visible: true    wIDth: 640    height: 480    Title: qsTr("Hello World")    MouseArea {        anchors.fill: parent        onClicked: {            delayTimer(800,function(){                console.log("here is console.....");                var t= Math.random();                console.log(t);            })        }    }    Timer{        ID:dtimer    }    function delayTimer(delayTime,cb) {        console.log("delayTimer is starting");        dtimer.interval = delayTime;        dtimer.repeat = false;        dtimer.triggered.connect(cb);        dtimer.start();    }}

点击几下,当我再次点击它时,输出是:

qml: delayTimer is startingqml: here is console.....qml: 0.27777099609375qml: here is console.....qml: 0.407012939453125qml: here is console.....qml: 0.60552978515625qml: here is console.....qml: 0.360107421875qml: here is console.....qml: 0.21942138671875qml: here is console.....qml: 0.252288818359375qml: here is console.....qml: 0.88134765625qml: here is console.....qml: 0.63092041015625qml: here is console.....qml: 0.5125732421875
解决方法 正如@ w1ck3dg0ph3r指出的那样,你有一个函数多次绑定到信号.但是,正如QML假设的那样,所有的插槽都是同时执行的,没有保证的顺序,所以我认为,如果QML决定在执行它之前首先断开你的函数cb,他的解决方案可能会失败.

可能会有一些预防措施,但它们似乎并不太安全,正如您在此示例中所看到的:

button {    onClicked: {        clicked.connect(clicked)        console.log('here')    }}

这会在第一次单击时产生无限循环,但可能预期连接仅在下次运行中执行,而不是已在同一运行中.

另一方面这个例子:

button {    onClicked: {        clicked.connect(function() {console.log('here'); clicked.connect(function() {console.log('there')})});    }}

从上面我们学到的,你可能会期望两个函数在第一次运行时执行,输出在这里和那里 – 这不是(至少在我的机器上)
因此,在执行过程中将绑定更改为信号时的行为定义不太明确.

更好的解决方案取决于您的用例.您想要将多个功能绑定到信号,还是始终只是一个?

我建议将您的函数存储在变量中,并在onClicked事件中处理断开连接:

button {    property var myCB    onClicked: {        delayTimer(delayTime,cb) {            if (myCB) dtimer.triggered.disconnect(myCB)            myCB = cb            dtimer.triggered.connect(myCB)            ...        }    }}

像这样,您可以确保在正确的时间执行断开连接.但是,如果计时器由某些其他源重新启动,则该函数仍然受约束.如果你不想这样,你需要自己的功能,以确保断开连接.

要提供量身定制的解决方案,您需要添加更多详细信息,说明您的用例是什么,以及您期望的具体内容.

总结

以上是内存溢出为你收集整理的c – 为什么Timer工作了很多次,即使我设置了repeat = false?全部内容,希望文章能够帮你解决c – 为什么Timer工作了很多次,即使我设置了repeat = false?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存