我正在尝试使用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中遇到了错误:
答案 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