Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 23.08.13 17:49
Оценка:
Здравствуйте.

Вот обновились до 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 Канада http://terrainformatica.com
Дата: 24.08.13 05:13
Оценка:
Здравствуйте, DeeoniS, Вы писали:

DS>В changelog последней версии Sciter есть такая строка:

DS>

DS>When window created in the same GUI thread its document namespace gets 'undefined' prototype. Used to be: current script environment namespace.

DS>У меня большие подозрение что эти проблемы связанны с данным изменением, но как починить я что-то не пойму.

Это изменение затрагивает ситуацию когда одно окно создается из другого типа:

...
var one = 12;
view.openNewWindow("otherHtml.html"); // custom native method that does ::CreateWindow() of another Sciter window.
...


И в otherHtml.html :

stdout.println(one); // used to print '12'
                     // now - prints 'undefined'


Но как я понимаю это не твой случай, так?
Re: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: c-smile Канада http://terrainformatica.com
Дата: 24.08.13 05:17
Оценка:
Здравствуйте, DeeoniS, Вы писали:

Попробуй в "в скриптовой функции, которую мы кидаем в рабочий поток" вставить:

debug namespaces;


он выведет текущий стек namespaces. Твои "нативные функции или объекты" должны там обнаружиться.
Re[2]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 25.08.13 17:27
Оценка:
Здравствуйте, 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 проблемы вызова скриптовых ф-й из нативного кода
От: c-smile Канада http://terrainformatica.com
Дата: 25.08.13 19:08
Оценка:
Здравствуйте, 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 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 26.08.13 09:58
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Извиняюсь, так вот надо

CS>
CS>debug namespace;
CS>

Ничего нигде не выводится, в debug output пусто. Или где-то в другом месте я должен что-то увидеть?

CS>И вообще в своей main функции объяви такую переменную:

CS>
CS>sciter::debug_output_console sciter_console;
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 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 28.08.13 13:25
Оценка:
Проблема все еще актуально. Прикладываю минимальный проект на котором она проявляется. Клик по Button 1 должен через секунду показать messagebox, который создает view. Клик по Button 2 отображает текст в окне. Первое не работает, второе работает. На предыдущей версии sciter работали оба варианта.
Re[5]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 28.08.13 13:35
Оценка:
Что-то не приаттачился файлик. Вот ссылка, чтобы скачать — http://sdrv.ms/153e5wF
Re[6]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: c-smile Канада http://terrainformatica.com
Дата: 29.08.13 03:42
Оценка:
Здравствуйте, 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 needed
        break;  
    }
    return 0; 
  }


private:
    HWND m_hWnd;
};
Re[7]: Sciter 1.0.10.12 проблемы вызова скриптовых ф-й из нативного кода
От: DeeoniS  
Дата: 29.08.13 08:57
Оценка:
Спасибо за sciter и debug console!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.