2015-08-29 6 views
8

Ich versuche, ein grundlegendes webworker Beispiel in C++ mit emscripten zu bauen. Die API sieht sehr einfach aus, aber ich kann es nicht funktionieren. Eigentlich wollte ich diese Funktionalität in meinem Projekt implementieren, aber nach dem Scheitern versucht, ein minimales Beispiel zu machen und es funktioniert auch nicht.Minimales funktionierendes Beispiel für emscripten webworker

Ich habe 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; 
} 

und 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); 
} 
} 

zusammengestellt über

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

und einem einfachen js Last über <script>-Tag auf der HTML-Seite .

Haupt lädt und startet, Ausgänge Main func. und dann worker js wird heruntergeladen. Aber weder Worker noch Callback ist outputed. Keine Fehler gemeldet.

+0

Macht die Ausführung von em ++ anstelle von emcc einen Unterschied? –

+1

Warum importieren Sie 'emscripten/bind.h'? –

Antwort

8

Kompilieren mit BUILD_AS_WORKER Flag.

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