2017-02-12 1 views
4

emscriptenを使用して、私が書いたJavaScriptライブラリを利用するCプログラムをコンパイルしており、それらを--js-libraryフラグと一緒にリンクしています。私のCコードは、ライブラリにPromiseを持つ関数を呼び出し、コールバックではCの呼び出し元からJS関数に渡されたメモリに与えられた結果を書きたいと思っています。約束なしCコードからの非同期のjavascriptライブラリ呼び出しが遅すぎる

lib.js他の機能において

mergeInto(LibraryManager.library, { 
    compute_js: function(input, out_buf) { 
    do_promise_computation(
     input 
    ).then(function(result){ 
     Module.print("Promise Returned fully"); 
     for (var i = 0; i < 8; i++) { 
     var num = result[i] 
     {{{makeSetValue('out_buf+(i*4)', 0, 'num', 'i32')}}} 
     } 
    }); 
} 

program.cを

#include <stdio.h> 
#include <stdint.h> 
#include <emscripten.h> 

extern void compute_js(int32_t, int64_t*); 

int main() { 
    int32_t input = 1234; 
    int64_t out_buf[4]; 
    int64_t* out_ptr = (int64_t*)(&out_buf); 
    printf("Calling Javascript\n"); 
    compute_js(input, out_ptr); 
    printf("%lld\n", out_buf[0]); 
    printf("%lld\n", out_buf[1]); 
} 

、:ここでの例では、(私は簡潔にするために約束の誤差を引くcatch一部省略)であります私がライブラリのために書いたことで、私はCコードから与えられたバッファにデータを書き込むことができましたが、今度は次のように出力されます:

Calling Javascript 
0 
0 
Promise Returned fully 

しかし、私はプロミスからの結果を待ってから、Cコードに書き込んで、がJavaScriptコールの後のCコードのprintfの前に来るようにしたいと思っています。 emscriptenでこれを行う方法はありますか?

+0

私はemscriptenとあまり慣れていないよ、私は怖いが、あなたはセマフォを使用できるかどうか尋ねている私の友人は、それはあなたの問題を解決する必要があります。 –

+0

この環境はわかりませんが、JavascriptでCコードの '.then()'ハンドラからコールバック関数を呼び出せますか? – jfriend00

答えて

1

ASYNCIFY_FUNCTIONSおよび_emscripten_async_resumeを使用してください。

https://kripken.github.io/emscripten-site/docs/porting/asyncify.html

+0

私はこれを試しましたが、すべてのことをした後でさえ、私はエラーが発生します。すなわち、私は '_emscripten_async_resume()'をどこで呼び出すべきかわかりません。私がC言語で呼び出すと、それは関数の暗黙の宣言であり、許可されていないと言います。 JSで呼び出すと、 'ReferenceError:___async is defined'と言われます。そして私は '-s ASYNCIFy = 1 -s ASINCIFY_FUNCTIONS = ['compute_js_helper']'(ヘルパー関数はJS関数呼び出しをラップするC関数です)でコードをコンパイルしています。 –

関連する問題