2015-08-29 66 views
8

我想用emscripten在C++中構建一個基本的webworker示例。該API看起來很簡單,但我無法得到它的工作。我其實想在我的項目中實現這個功能,但是在失敗之後嘗試做一個最小的例子,它也不起作用。emscripten webworker的最小工作示例

我已經main.cpp中:

#include <emscripten/emscripten.h> 
#include <emscripten/bind.h> 
#include <iostream> 

namespace e = emscripten; 

int counter = 0; 

void cback(char* data, int size, void* arg) { 
    std::cout << "Callback" << std::endl; 
    counter++; 
} 

void loop() { 
    std::cout << "Counter: " << counter << std::endl; 
} 

int main() { 
    std::cout << "Main func." << std::endl; 
    worker_handle worker = emscripten_create_worker("worker.js"); 
    emscripten_call_worker(worker, "one", 0, 0, cback, (void*)42); 

    emscripten_set_main_loop(loop, 2, true); 

    return 0; 
} 

和worker.cpp:

#include <iostream> 
#include <emscripten/emscripten.h> 

extern "C" { 

void one(char* data, int size) { 
    for(int i=0; i<10; i++) { 
     std::cout << "Worker" << std::endl; 
     emscripten_worker_respond_provisionally(0, 0); 
    } 
    emscripten_worker_respond(0, 0); 
} 
} 

通過<script>標籤通過

emcc -std=c++11 main.cpp -o main.js 
emcc -std=c++11 worker.cpp -s EXPORTED_FUNCTIONS="['_one']" -o worker.js 

和一個簡單的JS負荷編譯的HTML側。

主負載和啓動,輸出Main func.然後下載工人js。但輸出WorkerCallback都沒有。沒有錯誤報告。

+0

是否運行em ++而不是emcc有所作爲? –

+1

你爲什麼要導入'emscripten/bind.h'? –

回答

8

編譯BUILD_AS_WORKER標誌。

emcc -std=c++11 worker.cpp -s EXPORTED_FUNCTIONS="['_one']" -s BUILD_AS_WORKER=1 -o worker.js