Есть ли способ отправить параметры с моей предопределенной функцией napi_threadsafe_function? - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть приложение Electron, я построил аддон с помощью napi, и у меня есть функция javascript, которая обновляет пользовательский интерфейс на основе строкового входного параметра.

В аддоне я беру JS-функцию updateUI и создаю для нее поточную функцию обратного вызова.

Затем я запускаю долго работающую функцию (с лямбда-выражением), которая в конечном итоге вызывает функцию безопасности потока для обновления пользовательского интерфейса. Я могу успешно вызвать функцию, но не вижу способа передачи параметров в вызов в это время.

Не буду комментировать слишком много того, что я уже пробовал, но чтение документации приводит меня к мысли, что это невозможно (так как оно не упоминает об этом). Экспериментирование с «материалом» в 4 созданных nullptr и вызове nullptr также не увенчалось успехом.

Но я чувствую, что это очень простая функция, которая должна быть выполнимой, надеюсь, я неправильно понимаю или упускаю что-то очевидное.

function addText(msg) {/*append stuff*/}
myModule.napiSomeFunc(addText)

//NAPI_CALL_WITH_CHECK is just a c++ macro i defined that just checks the status returned and handles it accordingly, I know it works fine.

napi_value napiSomeFunc(napi_env env, napi_callback_info cbinfo) {

        //initial callback call setup
        size_t argc = 1;
        napi_value argv[1];
        NAPI_CALL_WITH_CHECK(napi_get_cb_info, env, cbinfo, &argc, argv, nullptr, nullptr);
        napi_value cb = argv[0]; // JS function

        napi_value name;
        NAPI_CALL_WITH_CHECK(napi_create_string_utf8, env, "testname", NAPI_AUTO_LENGTH, &name);

        napi_threadsafe_function safecb;
        NAPI_CALL_WITH_CHECK(napi_create_threadsafe_function,
            env,
            cb, // The JS function to callback to
            NULL, // Optional async resource
            name, // name for ^
            0, // Maximum size of the queue. 0 for no limit.
            1, // The initial number of threads, including the main thread, which will be making use of this function
            nullptr, //optional data to pass down to function immediately below this
            nullptr, // Optional function to call when the napi_threadsafe_function is being destroyed
            nullptr, // Optional data to attach to the resulting napi_threadsafe_function
            nullptr, // (call_js_cb) Optional callback which calls the JavaScript function in response to a call on a different thread
            &safecb // Result
       );


        // Lambda runs at the end of this function
        SuperLongRunningFunction(
            "other params",
            [safecb](const Result* res) {
                string logText = "";

                if (res) {
                    logText = "yay it worked";
                } else {
                    logText = "oh no it failed";
                }

                // ** Send logText as input parameter somehow??? **

                NAPI_EXTERN napi_status stat = napi_call_threadsafe_function(
                    safecb,
                    nullptr, // data to send into JS VIA call_js_cb
                    napi_tsfn_nonblocking
                );
            }
        );

        return nullptr;
    }

В моем коде JavaScript у меня есть проверка на нулевой вызов входного параметра для функции, и я вижу, что в моих кликах я запускаю вызов без входных данных.

Мне нужно сделать вызов с logText в качестве ввода, но я не могу понять, как.

Любые толчки в правильном направлении будут с благодарностью. Спасибо.

...