帧率
如果您只想知道自上次执行以来所用的时间,请查看FrameRateMorph
. 它包含两个实例变量lastDisplayTime
和framesSinceLastDisplay
,它们是在 Morph#step
方法中计算的:
FrameRateMorph>>#step
"Compute and display (every half second or so) the current framerate"
| now mSecs mSecsPerFrame framesPerSec newContents |
framesSinceLastDisplay := framesSinceLastDisplay + 1.
now := Time millisecondClockValue.
mSecs := now - lastDisplayTime.
(mSecs > 500 or: [mSecs < 0 "clock wrap-around"]) ifTrue:
[mSecsPerFrame := mSecs // framesSinceLastDisplay.
framesPerSec := (framesSinceLastDisplay * 1000) // mSecs.
"…"
lastDisplayTime := now.
framesSinceLastDisplay := 0]
您可以在变形中使用类似的逻辑。
请注意,FrameRateMorph
实现#stepTime
return 0
,以便尽可能频繁地调用它。您可能需要根据此数字调整计算。
进程同步
如果您的目标无法通过上述方式实现,您有三种选择。
省略块/叉
你真的需要叉子#timer
吗?那这个呢:
Myclass>>#timer
tstart:=Time millisecondClockValue.
sem:= Semaphor new.
sem wait.
Transcript show: result.
^ result
这将阻塞,直到您的结果准备好。
分叉等待
如果您坚持使用分叉块,请考虑#forkAndWait
:
Myclass>>#timer
tstart:=Time millisecondClockValue.
[sem:= Semaphor new.
sem wait.
Transcript show: result] forkAndWait.
^ result
这也将阻塞,直到您的结果准备好。
进行回调
准备好结果后,您可以主动调用代码
通过参数回调
将单参数块传递给更改后的计时器函数并对结果进行操作:
Myclass>>#timerDo: aBlock
tstart:=Time millisecondClockValue.
[sem:= Semaphor new.
sem wait.
Transcript show: result.
aBlock value: result] fork.
接着
| obj |
" assume that obj is an instance of Myclass"
obj timerDo: [:result |
"do something meaningful with the result, eg, show it "
blaObject showResult: result.].
通过实例变量回调块
添加一个实例变量,例如callBack
toMyclass
和 change #timer
to
Myclass>>#timer
tstart:=Time millisecondClockValue.
[sem:= Semaphor new.
sem wait.
Transcript show: result.
callBack value: result] fork.
然后像这样使用它
| obj |
" assume that obj is an instance of Myclass"
obj callBack: [:result |
"do something meaningful with the result, eg, show it "
blaObject showResult: result.].
obj timer.
通过消息发送回调
请注意 ,这可能很危险,而不是您所追求的
第三种选择不是将块保存为回调,而是在结果到达时直接向对象发送消息。
添加两个实例变量,例如target
and selector
toMyclass
和 change #timer
to
Myclass>>#timer
tstart:=Time millisecondClockValue.
[sem:= Semaphor new.
sem wait.
Transcript show: result.
target perform: selector with: result] fork.
然后像这样使用它
| obj |
" assume that obj is an instance of Myclass"
obj
target: blaObject;
selector: #showResult: .
obj timer.
但是,通过所有进程同步,您可能会遇到各种不同的麻烦,因此如果可能,请先尝试第一个选项。