это мой первый пост здесь. Я спрашиваю, потому что у меня закончились подсказки, и я не смог ничего найти по этому конкретному вопросу.
У меня такой вопрос: В Adobe AIR есть ли способ сделать синхронный эквивалент usleep () (задержка выполнения 200 мс), или есть способ указать где-нибудь время ожидания занятости SQLite? 1005 *
У меня есть приложение AIR, которое использует базу данных в синхронном режиме, поскольку код не может справиться с необходимостью событий / обратных вызовов в запросах SQL.
Иногда к базе данных обращаются из другого приложения, так что она занята. Следовательно, execute () оператора выдает SQLerror 3119 деталь 2206. В этом случае команда должна быть повторена после небольшой задержки.
Поскольку на компьютере запущено другое приложение, я хочу попытаться избежать занятого ожидания, однако я застрял с ним из-за трех вещей:
Во-первых, мне не удалось найти способ присвоить SQLConnection значение времени ожидания занятости, как это возможно в C с функцией sqlite3_busy_timeout ()
Во-вторых, мне не удалось найти эквивалент команды C usleep () в Adobe AIR / Actionscript.
В-третьих, я не могу использовать события / таймеры / обратные вызовы и т. Д. В этом месте. 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 циклов, чтобы уменьшить нагрузку на процессор во время ожидания, потому что приложение должно работать на ноутбуках, а на батарее.
Спасибо.
-Tino