这是我在这里的第一篇文章。我问,因为我的线索已经用完,我无法找到有关此特定问题的任何内容。
我的问题是:在Adobe AIR中,有没有办法做同步的usleep()等效(延迟执行200ms),或者有办法在某处指定SQLite忙超时吗?
我有一个AIR应用程序,它以同步模式使用数据库,因为代码无法满足SQL查询中事件/回调的需要。
有时会从另一个应用程序访问数据库,使其忙碌。因此,语句的execute()抛出SQLerror 3119细节2206.在这种情况下,命令应在短暂延迟后重试。
由于计算机上正在运行另一个应用程序,我想尽量避免忙碌等待,但是由于三件事我一直坚持:
首先,我无法找到一种方法来为SQLConnection提供一个繁忙的超时值,就像在C中使用函数sqlite3_busy_timeout()
一样。其次,我无法在Adobe AIR / Actionscript中找到等效的C usleep()命令。
第三,我无法在此位置使用事件/定时器/回调等。 SQL execute()必须是同步的,因为它是从深层嵌套的类中调用的,并且在应用程序中遍布各种各样的函数。
如果应用程序在执行SQL时可以处理事件/回调,我会使用异步数据库,所以使用事件无法解决此问题。必须在最低级别上重试,而不使用AIR事件处理工具。
最低级别的代码如下:
private static function retried(fn:Function):void {
var loops:int = 0;
for (;;) {
try {
fn();
if (loops)
trace("database available again, "+loops+" loops");
return;
} catch (e:Error) {
if (e is SQLError && e.errorID==3119) {
if (!loops)
trace("database locked, retrying");
loops++;
// Braindead AIR does not provide a synchronous sleep
// so we busy loop here
continue;
}
trace(e.getStackTrace());
trace(e);
throw e;
}
}
}
此功能的一个示例用途是:
protected static function begin(conn:SQLConnection):void {
retried(function():void{
conn.begin(SQLTransactionLockType.EXCLUSIVE);
});
}
此代码的输出类似于:
database locked, retrying
database available again, 5100 loops
阅读:应用程序每秒循环超过500次。我想以某种方式将此减少到5个循环以减少等待时的CPU负载,因为应用程序将在使用笔记本电脑时运行。
感谢。
-Tino