为什么需要使用send命令使计时器在LiveCode中工作

时间:2015-03-29 17:03:17

标签: timer send repeat livecode

来自LiveCode词典的

# 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

感谢。

2 个答案:

答案 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命令,但如果没有它,我就不会构建任何东西。