Вот обновились до Sciter 1.0.10.12 и появилась странная проблема. Есть нативный код, который получает скриптовую ф-ю, делает ее pinned и отправляет в рабочий поток. Из рабочего потока делается tiscript::post в поток GUI и там уже с помощью tiscript::call выполняется скриптовая функция.
Все отлично работало на предыдущей версии библиотеке, но в 1.0.10.12, если в скриптовой функции, которую мы кидаем в рабочий поток, есть обращения к нативным функция или объектам, то sciter сыпет исключениями. Причем такое поведение, по моим наблюдениям, характерно только для html страниц загруженных в главном окне. Если создать модальный диалог с помощью view.dialog, то там такие вызовы проходят нормально.
В changelog последней версии Sciter есть такая строка:
When window created in the same GUI thread its document namespace gets 'undefined' prototype. Used to be: current script environment namespace.
У меня большие подозрение что эти проблемы связанны с данным изменением, но как починить я что-то не пойму.
Re: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
Здравствуйте, c-smile, Вы писали:
CS>Попробуй в "в скриптовой функции, которую мы кидаем в рабочий поток" вставить:
CS>
CS>debug namespaces;
CS>
CS>он выведет текущий стек namespaces. Твои "нативные функции или объекты" должны там обнаружиться.
Что-то если вставить такое, то скрипты в этом документе вообще перестают выполняться.
CS>Но как я понимаю это не твой случай, так?
Мой случай примерно такой. При создании главного окна регистрирую нативную функцию myFunc с помощью define_global_function и нативный класс рабочего потока WorkThread. Затем загружаю главный документ где в табах (behavior: tabs) подгружаются документы в фреймах для отображения. В одном из этих документов на клик по кнопке повешен такой код:
function callback()
{
myFunc();
// Some code
}
workThread.execCallbackAfterWork(callback);
Когда колбэк начинает выполняться то на вызове myFunc() вываливается exception в debug output: tis::error_event at memory location. Код до вызова myFunc отрабатывает нормально.
Re[3]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
Здравствуйте, DeeoniS, Вы писали:
DS>Что-то если вставить такое, то скрипты в этом документе вообще перестают выполняться.
Извиняюсь, так вот надо
debug namespace;
CS>>Но как я понимаю это не твой случай, так? DS>Мой случай примерно такой. При создании главного окна регистрирую нативную функцию myFunc с помощью define_global_function и нативный класс рабочего
Эта define_global_function с каким ns вызывается?
И вообще в своей main функции объяви такую переменную:
sciter::debug_output_console sciter_console;
Прлучишь вменяемые сообщения об ошибках.
Re[4]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
Здравствуйте, c-smile, Вы писали:
CS>Извиняюсь, так вот надо CS>
CS>debug namespace;
CS>
Ничего нигде не выводится, в debug output пусто. Или где-то в другом месте я должен что-то увидеть?
CS>И вообще в своей main функции объяви такую переменную: CS>
CS>Прлучишь вменяемые сообщения об ошибках.
Объявил в самом начале main в C++ коде. Эксепшены которые сыпались просто с адресами так и сыпятся. В моих нативных объектах тоже при вызове throw_error(vm, L"error text") в дебажном выводе только адреса в памяти где произошло исключение.
CS>Эта define_global_function с каким ns вызывается?
Вот так вот примерно вызывается:
hWnd = ::CreateWindowEx(...);
auto vm = SciterGetVM(hWnd);
define_global_function(vm, &nativeMyFunc);
Еще, если в таком колбэке вызвать например view.msgbox(), то тоже сыпятся исключения и скрипт после этого перестает выполняться. Т.е. дело не в том как я создаю нативные объекты. И опять таки, в документах, которые загружаются в модальный диалог созданный через view.dialog(), колбэки вызываемые тем же способом нормально показывают message box при вызове view.msgbox() и скрипт отрабатывает.
Если в модальный диалог создавать из callback, то отображение этого диалога ломается. Также отображение ломалось когда я допусткал синтаксическую ошибку в скриптах этого диалога, т.е. пропускал ";" или еще что-нибудь в этом роде.
Вот такие вот проявления проблемы.
Re[4]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
Проблема все еще актуально. Прикладываю минимальный проект на котором она проявляется. Клик по Button 1 должен через секунду показать messagebox, который создает view. Клик по Button 2 отображает текст в окне. Первое не работает, второе работает. На предыдущей версии sciter работали оба варианта.
Re[5]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
Здравствуйте, DeeoniS, Вы писали:
DS>Что-то не приаттачился файлик. Вот ссылка, чтобы скачать — http://sdrv.ms/153e5wF
Ага, спасибо за пример. Забирай версию 1.0.10.13
А про debug console, в свой класс добавь on_callback_host() имплементацию примерно так:
(В S2/3 я этот механизм поменял, уже стал забывать что я там в S1 нафантазировал на эту тему)
class MainFrame : public sciter::notification_handler<MainFrame>,
public sciter::event_handler,
public sciter::queue<MainFrame>
{
public:
MainFrame();
HWND get_hwnd() const;
HINSTANCE get_resource_instance() const;
bool IsValid() const;
protected:
bool Setup(const wchar_t* url, HWND parent = NULL);
private:
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
static MainFrame* GetPtr(HWND hWnd);
static bool InitClass();
virtual LRESULT on_callback_host(LPSCN_CALLBACK_HOST pns)
{
static sciter::debug_output_console dbgcon;
switch(pns->channel)
{
case 0: // 0 - stdin, read from stdin requested, put string into pnmld->r break;
case 1: // 1 - stdout, "stdout << something" requested, pnmld->p1 is
// string to output.
dbgcon.printf("stdout:%S", pns->p1.to_string().c_str() );
break;
case 2: // 2 - stderr, "stderr << something" requested or error happened,
// pnmld->p1 is string to output.
dbgcon.printf("stderr:%S", pns->p1.to_string().c_str() );
break;
default:
// view.callback(channel,p1,p2) call from script
dbgcon.printf("callback on channel %d, values: %S,%S\n", pns->channel, pns->p1.to_string(CVT_JSON_LITERAL).c_str(), pns->p2.to_string(CVT_JSON_LITERAL).c_str() );
// implement this if neededbreak;
}
return 0;
}
private:
HWND m_hWnd;
};
Re[7]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода