У меня архитектура приложения примерно такая:
в tiscript коде я вызываю нативные методы аля view.DoSomeAsync(function (err, args) {...обрабатываем результат...});
DoSomeAsync это примерно что-то такое работающее в новом потоке:
void DoSomeAsync(sciter::value clbk)
{
thread([=](int err){
clbk.call(sciter::value(err), ...);
}).detach();
}
Мне не очень понятно чем ограничено время жизни этого clbk и нормально ли его вызывать в потоке?
И в целом такой подход имеет право на жизнь?
Здравствуйте, C0x, Вы писали:
C0x>Мне не очень понятно чем ограничено время жизни этого clbk и нормально ли его вызывать в потоке?
C0x>И в целом такой подход имеет право на жизнь?
"Да" на оба вопроса. И это тот же подход что используется в моем ui-framework demo:
https://github.com/c-smile/sciter-sdk/blob/master/demos/ui-framework/worker-thread.cpp#L14
Там создается worker thread, в него передаются script callbacks (каждый завернут в sciter::value) и эти script callback функции вызываются уже из твоего рабочего потока.
чем ограничено время жизни этого clbk
В общем-то всё тривиально:
sciter::value это (в терминах C++) std::shared_ptr<object> для скриптовых объектов и функций.
Т.е. пока живут sciter::value которые держат ссылки на твои функции эти функции живы.
В данном конкретном случае — до (нормального) завершения твоего рабочего потока. Потом сработают sciter::valu деструктор и освободит ту функцию.
Потом, при очередном GC событии, та функция окончательно уйдет.
Здравствуйте, C0x, Вы писали:
C0x>Здравствуйте, c-smile, Вы писали:
CS>>В общем-то всё тривиально:
CS>>Т.е. пока живут sciter::value которые держат ссылки на твои функции эти функции живы.
C0x>Я имел ввиду время жизни не самих объектов value, а к примеру, что произойдет, если до вызова clbk.call(...), frame загрузит другой htm контент, т.е. DOM полностью изменится вместе со всеми скриптами и в новом контенте данной функции не будет. Будет просто холостой вызов или ошибка?
Если тот callback использует в коде какие DOM элементы то скрипт отвалится с ошибкой при попытке что-то сделать с тем элементом, и в return value ты получишь error.
C которой ты можешь, например, сделать такое:
if( rv.is_error_string()) {
aux::w2a u8 (rv.get(WSTR("")));
throw sciter::script_error(u8.c_str());
}