:
# A simple timer using send example
local sTime
on mouseUp
put 0 into sTime
send "timerIncrement" to me in 1 seconds
end mouseUp
on timerIncrement
add 1 to sTime
put sTime
send "timerIncrement" to me in 1 seconds
end timerIncrement
为什么我们必须使用“发送”命令才能使其正常工作?
为什么我不能每秒更新卡片上的标签?
on startTimer
repeat until lstopTimer is "true"
updateTimer
wait 1 second
end repeat
end startTimer
on updateTimer
put the long english time into field "time"
end updatetimer
感谢。
答案 0 :(得分:0)
好的马克已经回答了,但这里有:
您可以使用您的代码,但需要使用:
wait 1 second with messages
然后LiveCode会让(LiveCode)系统的其他部分有时间工作,但无论如何你的代码都会停止,因此很难执行其他操作。
使用send ... in [time]
您的界面不会以任何方式停止。屏幕将相应更新,所有处理程序都可以进行操作。正如马克写道,如果您的应用正在忙着做其他事情,发送将排队。这意味着如果你想显示一个倒计时,让我们说十分之一秒,你不能只将间隔设置为100毫秒,然后将起始值减少0.1。 (因为你无法100%确定它会在确切的时间触发,而且最重要的是你的定时器代码可能每次运行几毫秒)。相反,您需要再次检查经过的毫秒数。假设您希望在“Timer”字段中以0.1s精度显示定时器时间:
local lStartTime, lTimerTime
on startTimer pTimerTimeInSeconds
put the milliseconds into lStartTime
put lStartTime + pTimerTimeInSeconds * 1000 into lTimerTime
runTimer
end startTimer
on runTimer
put lTimerTime - the milliseconds into tTimeLeft
put format("%.1f", tTimeLeft * 0.001) into field "Timer"
if tTimeLeft > 0 then
send "runTimer" to me in 100 milliseconds
else
put 0 into field "timer" # To ensure we don't get a negative number
end if
end runTimer
使用send ... in [time]
即使计时器正在运行,LiveCode也会很乐意做其他事情,并且您的计时器仍会正确计数。您需要满足的最后一件事是,如果您执行任何可能导致代码停止工作的事情,您需要取消下一次发送。如果你继续使用另一张卡,你的“runtimer”仍会被调用,但是当它试图更新字段时,可能根本就没有字段。要处理它,您可能需要添加一些代码。首先,您需要一个变量来保存send命令返回的id
local lStartTime, lTimerTime, lTimerID
然后你需要在调用send
后保存id...
send "runTimer" to me in 100 milliseconds
put the result into lTimerID
然后你可以根据需要取消发送:
on cancelTimer
cancel lTimerID
end cancelTimer
答案 1 :(得分:0)
使用send命令,如果需要,可以完全控制消息队列(在ide之外)。它非常有用,因为你基本上可以控制发动机几乎每毫秒级别(或多或少)。谁看了这个答案。它很容易学习send命令,但如果没有它,我就不会构建任何东西。