Время жизни callback функций
От: C0x  
Дата: 08.10.18 13:19
Оценка:
У меня архитектура приложения примерно такая:

в tiscript коде я вызываю нативные методы аля view.DoSomeAsync(function (err, args) {...обрабатываем результат...});
DoSomeAsync это примерно что-то такое работающее в новом потоке:

void DoSomeAsync(sciter::value clbk)
{
    thread([=](int err){
        clbk.call(sciter::value(err), ...);
    }).detach();
}


Мне не очень понятно чем ограничено время жизни этого clbk и нормально ли его вызывать в потоке?
И в целом такой подход имеет право на жизнь?
Re: Время жизни callback функций
От: c-smile Канада http://terrainformatica.com
Дата: 08.10.18 14:43
Оценка:
Здравствуйте, 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 событии, та функция окончательно уйдет.
Re[2]: Время жизни callback функций
От: C0x  
Дата: 08.10.18 14:59
Оценка:
Здравствуйте, c-smile, Вы писали:


CS>В общем-то всё тривиально:

CS>Т.е. пока живут sciter::value которые держат ссылки на твои функции эти функции живы.

Я имел ввиду время жизни не самих объектов value, а к примеру, что произойдет, если до вызова clbk.call(...), frame загрузит другой htm контент, т.е. DOM полностью изменится вместе со всеми скриптами и в новом контенте данной функции не будет. Будет просто холостой вызов или ошибка?
Re[3]: Время жизни callback функций
От: c-smile Канада http://terrainformatica.com
Дата: 10.10.18 04:21
Оценка:
Здравствуйте, 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());
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.