正如每个Haxe开发人员所知道的,您可以使用haxe.Timer.delayed()
延迟函数调用一段时间。但是Neko根本不存在这个功能。有没有办法达到相同的结果?Neko和haxe.Timer.delayed()
3
A
回答
4
不得不检查第一,但
function delayed(f, time) {
neko.vm.Thread.create(function() {
neko.Sys.sleep(time);
f();
});
}
可能是最接近的事情成为可能。唯一的缺点是应用程序变成多线程,这可能导致严重的问题。
0
是的我除了你在第一个答案中提到的内容外什么都不知道。在Linux上,您可以使用SIGALARM - 但这看起来并不简单,100%纯C代码,需要小心处理以避免虚拟机崩溃。
1
我想过你的问题,我认为最好的方法是为Neko创建你自己的Timer类。我为你一个Timer类:
NekoTimer.hx
package;
import neko.Sys;
class NekoTimer
{
private static var threadActive:Bool = false;
private static var timersList:Array<TimerInfo> = new Array<TimerInfo>();
private static var timerInterval:Float = 0.1;
public static function addTimer(interval:Int, callMethod:Void->Void):Int
{
//setup timer thread if not yet active
if (!threadActive) setupTimerThread();
//add the given timer
return timersList.push(new TimerInfo(interval, callMethod, Sys.time() * 1000)) - 1;
}
public static function delTimer(id:Int):Void
{
timersList.splice(id, 1);
}
private static function setupTimerThread():Void
{
threadActive = true;
neko.vm.Thread.create(function() {
while (true) {
Sys.sleep(timerInterval);
for (timer in timersList) {
if (Sys.time() * 1000 - timer.lastCallTimestamp >= timer.interval) {
timer.callMethod();
timer.lastCallTimestamp = Sys.time() * 1000;
}
}
}
});
}
}
private class TimerInfo
{
public var interval:Int;
public var callMethod:Void->Void;
public var lastCallTimestamp:Float;
public function new(interval:Int, callMethod:Void->Void, lastCallTimestamp:Float) {
this.interval = interval;
this.callMethod = callMethod;
this.lastCallTimestamp = lastCallTimestamp;
}
}
这样称呼它:
package ;
import neko.Lib;
class Main
{
private var timerId:Int;
public function new()
{
trace("setting up timer...");
timerId = NekoTimer.addTimer(5000, timerCallback);
trace(timerId);
//idle main app
while (true) { }
}
private function timerCallback():Void
{
trace("it's now 5 seconds later");
NekoTimer.delTimer(timerId);
trace("removed timer");
}
//neko constructor
static function main()
{
new Main();
}
}
希望有所帮助。
注意:这个有100ms的精度。您可以通过减少timerInterval设置来增加此值。
1
我也使用了这个类,我发现了一个问题。因为不是完全实时的,所以睡眠间隔,调用函数,并再次睡眠间隔。所以,根据您运行的功能需要多长时间,它会更慢或更快。
我更换39行,像这样解决了这个问题:
//timer.lastCallTimestamp = Sys.time() * 1000;
timer.lastCallTimestamp = timer.lastCallTimestamp + timer.interval;
相关问题
- 1. 春季启动和Thymeleaf Neko HTML错误
- 2. Neko Dll在Haxe C++目标
- 3. 只有一个neko文件
- 4. NME更改C++和Neko目标的窗口标题
- 5. Haxe:从neko,cpp和java sys树中导入
- 6. 在Neko中产生NoSuchMethodException的deftrait
- 7. neko vm?需要像jvm一样下载?
- 8. 如何发送来自Haxe/Neko的HTTP PUT请求?
- 9. 如何在Android上Http请求Clojure [lein droid&neko]
- 10. 无法在Xerces或Neko的节点上调用getElementsByTagName?
- 11. OpenFL URLLoader无法在Android上运行(与Haxe/Neko一起工作)
- 12. 如何使用CyberNeko获取html内容?
- 13. haxe/openfl ::比较在neko中失败,但在html5中可用
- 14. FlashDevelop/OpenFL:如何将默认目标设置为neko
- 15. 在Haxe(Neko或Windows目标)中创建透明窗口
- 16. HaxeFlixel:在运行时使用Neko目标的FlxSprite动画失败
- 17. 不能在简单的haXe的程序
- 18. 麻烦理解如何使用build.hxml
- 19. 在win32上编译NekoVM dll
- 20. Haxe如何加快编译速度(选择最快的目标)
- 21. HaxeUI库不能和Lime/openFL/Haxe一起使用
- 22. 如何使用Eclipse编译Haxe程序?
- 23. 如何获取可执行文件路径?
- 24. 我不能用Haxe编译
- 25. FDT的Haxe Viewer不会启动我的项目
- 26. React-Router Link不触发组件新鲜
- 27. 在HAXE
- 28. haXe的不能找到haxelib
- 29. 如何从Java中的HTML页面提取JavaScript链接?
- 30. Windows上的OpenFL基本安装不起作用?
什么样的问题,如果你只为此创建一个线程? – Tom 2010-05-17 18:17:55
@Tom,函数f()将在另一个线程的上下文中执行。它可能使用共享资源或调用其他函数,它们使用共享资源。这种情况没有什么特别的,只是普通的多线程应用程序。 – vava 2010-05-17 19:06:38