2015-08-29 18 views
8

Sto cercando di creare un esempio di base per il webworker in C++ con emscripten. L'API sembra molto semplice, ma non riesco a farlo funzionare. In realtà volevo implementare questa funzionalità nel mio progetto, ma dopo aver fallito ho cercato di fare un esempio minimo e anche questo non funziona.Esempio di funzionamento minimo per webworker emscripten

ho 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; 
} 

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

compilato via

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

e caricare un semplice js tramite <script> tag sul lato html .

Principali carichi e avviamenti, uscite Main func. e quindi worker js viene scaricato. Ma né WorkerCallback viene prodotto. Nessun errore segnalato.

+0

L'esecuzione di em ++ invece di emcc fa la differenza? –

+1

Perché importate 'emscripten/bind.h'? –

risposta

8

Compilare con flag BUILD_AS_WORKER.

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