Russian Qt Forum
Ноябрь 22, 2024, 23:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно скопировать переменную из одной QScriptEngine в другую  (Прочитано 2643 раз)
Sasha
Гость
« : Май 27, 2014, 17:14 »

Здравствуйте,
Основная задача - сделать разделяемую между двумя и более скриптами переменную

Подробнее можно сказать так:
1) Есть 2 объекта класса QScriptEngine, т.е. 2 независимых скрипта
2) Каждому из них доступна ф-я, которая создаёт переменную по имени. Причём эта переменная создаётся только в том случае, если её ещё нет. Проверка осуществляется по имени.
3) Любой скрипт может менять переменную, причём, её новое значение, должен увидеть 2-й скрипт.

Проблемная часть в коде выглядит так:
Код
C++ (Qt)
QScriptValue getSet( QScriptContext *ctx, QScriptEngine *eng )
{
if( ctx->argumentCount() == 0 )
return m_var;
m_var = ctx->argument(0);
return m_var;
}
 
Сам код работает без ошибок. Но когда один скрипт с его помощью установил значение переменной m_var, а другой её взял и пытается использовать, вот тут и начинаются проблеммы. В отладчике видно, что на некотором этапе происходит проверка, является ли переменная созданной в скрипте, если да, то является ли она принадлежащей данному скрипту и если нет то дальше работать нехотим и получите ASSERT.
После долгих исканий я написал код при возврате в таком виде:
Код
C++ (Qt)
QScriptValue mkNew( const QScriptValue &v, QScriptEngine *eng )
{
QScriptEngine *pengOrig = v.engine();
return (v.isValid()==false
? eng->undefinedValue()
: ((pengOrig==NULL || pengOrig==eng)
? v
: (v.isUndefined()
? eng->undefinedValue()
: (v.isNull()
? eng->nullValue()
: eng->toObject( v )
 )
 )
 )
);
}
QScriptValue getSet( QScriptContext *ctx, QScriptEngine *eng )
{
if( ctx->argumentCount() == 0 )
return mkNew( m_var, eng );
m_var = ctx->argument(0);
return m_var;
}
 
И радовался, пока не попытался так передать массив (объект не пробовал, но думаю будет тоже самое). пока ещё долго отладчиком не ходил, но по аналогии думаю, что проблемма в том, что мой код более-менее нормально преобразовывает только верхушку иерархии, а внутренние объекты так и остаются пренадлежащими другому скрипту, что опять вызывает проблеммы.
Неужели нужно всю иерархию вручную преобразовывать?

Есть ли готовый способ нужного мне преобразования?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 21.