从emscripten线程访问js上下文

时间:2018-07-11 08:02:00

标签: emscripten

我喜欢从线程(使用emscripten编译)中调用某些global-context-js-function,但是无法访问global-Js-context(ReferenceError:未定义jsFunc)。我可以想象这个问题的主要原因是WebWorker(用于emscripten中的线程)无法访问global-js-context(例如window)。

是否有办法从cpp-emscripten-thread访问global-js-context?或者至少在线程和global-js-context之间使用某种事件总线?有什么交流的方法吗?

现在,我正在js上对cpp变量进行轮询,该变量由线程更改。我希望有更好的方法。

在下面找到此问题的示例。

也许我为此忽略了一些脚本功能?

谢谢

Benedikt。

#include <pthread.h>
#include <emscripten.h>

EM_JS(void, jsFunc, (int msg), {
    // some function in global js context
    myCustomLog(msg);
});


void* perform_work(void*) {
  printf("in thread \n");

  // this call of some global scope js function fails
  // ReferenceError: jsFunc is not defined
  jsFunc(1);
}

int main(int argc, char** argv) {
  pthread_t thread;
  printf("in main\n");

  // this call of some global scope js function works fine
  jsFunc(0);

  pthread_create(&thread, NULL, perform_work, NULL);
}

内部版本:

emcc -o test.html  -s USE_PTHREADS=1  ../main.cpp 

1 个答案:

答案 0 :(得分:0)

我找到了方法。

MAIN_THREAD_ASYNC_EM_ASM('myCustomLog(3);');

myCustomLog(3);是浏览器主线程中的函数

请参阅https://github.com/kripken/emscripten/blob/ccbc3ec51bb905c024e83de7add950dc49345918/system/include/emscripten/em_asm.h#L204-L209