Hello ANdrii, Your code flows like this:
1. Emscripten's main is called 2. myObj is created within the scope of main 3. sendRequest is called with myObj as its parameter 4. sendRequest sets a timeout to call "sayHi" on myObj 5. main returns, destroying myObj 100ms later 6. The timeout fires, trying to access myObj You can create myObj with a static lifetime or heap allocate it and return a smart pointer. On Monday, March 7, 2016 at 3:49:10 AM UTC-8, Andrii Heonia wrote: > > Hello Brion, > > Thank you for your answer. I've changed a bit my example (now > noExitRuntime=true and callback is global) but it still doesn't work. My > callback dies before async call (and I don't get how to keep it alive). You > can find my code here > <https://github.com/AndriiHeonia/async-emcc/tree/7207aebdcc65b5d183f1a26516ccdd77eb06ce8e>. > > What I'm doing wrong? > > Thanks in advance! > > On Friday, March 4, 2016 at 7:45:15 PM UTC+1, Brion Vibber wrote: >> >> Two things: >> >> First, you need to make sure the C runtime doesn't shut down when main() >> exits -- see >> https://kripken.github.io/emscripten-site/docs/api_reference/module.html#Module.noExitRuntime >> >> Second, you need to make sure your object doesn't go out of scope and get >> deleted at the end of the main() function. You'll have to store it in a >> global variable or something. >> >> -- brion >> >> On Fri, Mar 4, 2016 at 9:57 AM, Andrii Heonia <[email protected]> wrote: >> >>> How can I call C++ callback asynchronously from JavaScript? >>> >>> >>> This is my JS code: >>> >>> >>> <script type="text/javascript"> >>> function sendRequest(callback) { >>> setTimeout(function(){ >>> callback["sayHi"](); >>> }, 100); >>> } >>> </script> >>> >>> >>> This is my C++ code: >>> >>> >>> #include <emscripten/emscripten.h> >>> #include <emscripten/bind.h> >>> >>> using namespace emscripten; >>> class MyClass { >>> public: >>> void sayHi () { >>> printf("Hello! \n"); >>> }; >>> }; >>> EMSCRIPTEN_BINDINGS(MyClass) >>> { >>> class_<MyClass>("MyClass") >>> .function("sayHi", &MyClass::sayHi); >>> } >>> >>> int main() { >>> val window = val::global("window"); >>> auto myObj = MyClass(); >>> window.call<void>("sendRequest", myObj); >>> return 0; >>> } >>> >>> >>> When I execute this code in browser it fails with error: >>> >>> Uncaught BindingError: Cannot pass deleted object as a pointer of type >>> MyClass* >>> >>> >>> I use emcc 1.35.22 and compile it with this command: >>> >>> ~/app/emsdk_portable/emscripten/tag-1.35.22/emcc main.cpp --bind -o out. >>> js >>> >>> >>> Thank you in advance! >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "emscripten-discuss" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
