В Emscripten C ++ / wbasm как получить событие «на странице закрыто» - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть программа C +, которая компилируется в веб-сборку с использованием системы emscripten.Я хотел бы очистить некоторые вещи, очистить файлы и т. Д., Когда страница, на которой запущена программа, закрыта.

в основном есть:

emscripten_set_main_loop_arg(onMainLoopTick, arg, 0, 1);

В настоящее время, когда страница закрывается«процесс» просто завершается и не продолжается после «симулятора цикла».Я полагаю, что мне нужно получить событие со страницы, которое будет блокировать основной поток до тех пор, пока код C ++ не обработает его и не очистит его от беспорядка.

Какое событие следует переслать в C ++ и как его использовать?

1 Ответ

0 голосов
/ 29 ноября 2018

Первое, что нужно знать, это то, что нет ни нативной библиотеки, ни API для WebAssembly (я имею в виду ... все же, для MVP. Существуют нативные функции, такие как потоки, входящие в функцию после MVP ).Это означает, что все системные библиотеки в C ++ реализуются путем импорта эмулированных функций JavaScript.Поэтому, если вы ищете встроенные функции, такие как обнаружение событий закрытия, вам следует проверить, есть ли API-интерфейсы JS / HTML5, которые делают подобные вещи.

Чтобы увидеть, как это работает, откройте сгенерированный файл .wast и найдитеimport инструкции и сгенерированные файлы JS.Кроме того, вам может потребоваться выполнить прямой поиск в Emscripten , чтобы проверить, есть ли привязки JS / HTML5, доступные на стороне C ++, поскольку их документация достаточно велика и ее трудно просматривать.

Придерживаниек слову, события HTML5, которые вызываются при закрытии: beforeunload и unload.Я бы предпочел использовать событие beforeunload.Emscripten предоставляет em_beforeunload_callback тип функции обратного вызова и emscripten_set_beforeunload_callback для регистрации в html5.h привязках .

В противном случае вы используете их напрямую.Например:

В C ++:

void EMSCRIPTEN_KEEPALIVE clean_stuff() {
    // Clean up the mess...
    // You should use EMSCRIPTEN_KEEPALIVE or
    // add it to EXPORTED_FUNCTIONS in emcc compilation options
    // to make it callable in JS side.
}

В JS:

window.addEventListener("beforeunload", function (event) {
    // Exported functions are prefixed by an underscore
    Module._clean_stuff();
});
...