.js созданный (Webassembly и emscripten) работает только один раз - PullRequest
0 голосов
/ 22 февраля 2019

Я использую Webassembly и emscripten для проекта, и веб-страница работает очень хорошо.В нем я отправляю текстовое поле с информацией в файл .js, созданный (Webassembly и emscripten), для обработки, но, о, есть проблема !!, работает только один раз, когда я изменяю то, что находится в текстовом поле, и повторно отправляюк JS, это ничего не делает.Когда я перезагружаю страницу, она снова работает (только один раз).

Я использую этот способ (можно найти на Предоставление стандартного ввода для программы HTML с шифрованием? ):

Я комментирую run ();в конце emscript

// in my emscript 

// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;
if (Module['noInitialRun']) {
   shouldRunNow = false;
}
//run(); // << here
// {{POST_RUN_ADDITIONS}}

.

 result = areaInput(); \\and add areaInput in result

добавьте приведенный ниже код в мой файл для активации run () в emscript

<script>
var message;
var point = -1;
function getArea(){
   message = document.getElementById('input').value.split('\n');
}
function areaInput(){
  if(point >= message.length - 1){
    return null;
  }
  point += 1;
  return message[point];
}
function execEmscript(){
  window.console = {
     log: function(str){
        document.getElementById("output").value += "\n" + str;
    }
 }
getArea();
run();
}
</script>

io textareas

<textarea id="input" cols="80" rows="30"></textarea>

<textarea id="output" cols="80" rows="30"></textarea>

и кнопка

<button onclick="execEmscript();">run</button>

1 Ответ

0 голосов
/ 25 февраля 2019

Может быть, эти настройки будут полезны:

из src / settings.js :

// Whether we will run the main() function. Disable if you embed the generated
// code in your own, and will call main() yourself at the right time (which you
// can do with Module.callMain(), with an optional parameter of commandline args).
var INVOKE_RUN = 1;

// If 0, the runtime is not quit when main() completes (allowing code to
// run afterwards, for example from the browser main event loop). atexit()s
// are also not executed, and we can avoid including code for runtime shutdown,
// like flushing the stdio streams.
// Set this to 1 if you do want atexit()s or stdio streams to be flushed
// on exit.
var EXIT_RUNTIME = 0;

В вашей версии Emscripten вы можетепо умолчанию EXIT_RUNTIME = 1.Интересны и другие параметры из этого файла.

Поэтому попробуйте указать команду от -s INVOKE_RUN=0 -s EXIT_RUNTIME=0 до emcc (тогда вам не нужно комментировать run()).

Новаша программа может не ожидать, что вы вызовете main() несколько раз.Возможно, это можно обойти, установив EXPORTED_FUNCTIONS для экспорта какой-либо другой функции C и вызова ее из вашего JS (не уверен, но сначала вам может потребоваться вызвать main()).

...