使用std :: thread时无法在'WorkerGlobalScope'上执行'importScripts'

时间:2019-12-22 16:12:21

标签: web-worker emscripten webassembly

我正在尝试使用std :: thread。

main.cpp

int main()
{
    std::cout << "Welcome WASM!" << std::endl;
    std::cout << "Main thread=" << std::this_thread::get_id() << std::endl;

    auto a2 = std::thread([](){
        std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl;
        unsigned int i = 0; 
        while (i < 100) {
            std::cout << i++ << '\n';
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        }
    });

    a2.detach();
}

编译:

emcc -O2 -std=c++17 -s USE_PTHREADS=1 -o build\main.js main.cpp

此命令生成 main.js,main.worker.js和main.wasm 。 我的HTML使用main.js

<script src="main.js"></script>

但是我在main.worker.js中遇到了错误:

chrome dev tool screenshot

1 个答案:

答案 0 :(得分:0)

解决方案参考:https://emscripten.org/docs/compiling/WebAssembly.html#web-server-setup

找到了解决方案,问题出在我用来提供文件(HTML / js / wasm)的Web服务器上。 之前我通过命令python -m SimpleHTTPServer 8000运行 这是通过MIME类型“ text / pain ”提供的所有文件(js / wasm),而chrome浏览器只是拒绝了它(我们可以在开发工具屏幕快照中看到它)。 Chrome之前期望wasm和js文件的 application / wasm application / javascript MIME类型。

正如其中一个StackOverflow伙伴所建议的那样,现在我正在运行Web服务器,该Web服务器使用 application / wasm 提供WASM文件,并提供 application / javascript MIME类型的Js文件。现在所有错误都消失了,我可以同时使用std :: thread和std :: async了。

server.py

import SimpleHTTPServer
import SocketServer

PORT = 8000

class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): pass

Handler.extensions_map['.wasm'] = 'application/wasm'
Handler.extensions_map['.js'] = 'application/javascript'

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

main.cpp

int main()
{
    std::cout << "Welcome WASM!" << std::endl;
    std::cout << "Main thread=" << std::this_thread::get_id() << std::endl;

    auto f = std::thread([](){
        std::cout << "Worker thread=" << std::this_thread::get_id() << std::endl;
        unsigned int i = 0; 
        while (i < 100) {
            std::cout << i++ << '\n';
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        }
    });

    f.detach();
}

编译命令

emcc -std=c++17 --bind  -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=2 -s PROXY_TO_PTHREAD=1 -s TOTAL_MEMORY=1073741824 -o build\main.js main.cpp -s ASSERTIONS=1