Создание метода в Rust, который выполняет неблокирующий - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь соединить SDL2 с Node.js с помощью Rust, для этого я использую Neon-Bindings . Мне удалось реализовать очень простой класс в Rust, который открывает окно, и этот класс доступен для Node.js. Я должен использовать класс, иначе SDL2 не будет иметь подходящего видеодрайвера ( см. Эту проблему ). Это моя реализация Rust:

#[macro_use]
extern crate neon;
extern crate sdl2;

use neon::context::Context;
use neon::types::JsUndefined;

pub struct Canvas();

declare_types! {
    pub class JsCanvas for Canvas {
        init(mut _cx) {
            Ok(Canvas())
        }

        method open(mut cx) {
            let sdl_context = sdl2::init()
            .or_else(|err| cx.throw_error(err.to_string()))?;

            let video_subsystem = sdl_context.video()
                .or_else(|err| cx.throw_error(err.to_string()))?;

            let _window = video_subsystem
                .window("Game", 900, 700)
                .resizable()
                .build()
                .or_else(|err| cx.throw_error(err.to_string()))?;

            let mut event_pump = sdl_context.event_pump().or_else(|err| cx.throw_error(err.to_string()))?;
            'main: loop {
                for event in event_pump.poll_iter() {
                    match event {
                        sdl2::event::Event::Quit { .. } => break 'main,
                        _ => {}
                    }
                }
                // render window contents here
            }
            Ok(JsUndefined::new().upcast())
        }
    }
}

register_module!(mut cx, {
    cx.export_class::<JsCanvas>("Canvas")?;

    Ok(())
});

И я могу использовать это в JavaScript вот так:

// My Rust implementation exposed to Node.js as native node extension
const { Canvas } = require("../native");

const canvas = new Canvas();

console.log("foo");

canvas.open();

console.log("bar");

Это работает, я вижу окно. Проблема, с которой я столкнулся с этой реализацией, заключается в том, что вызов canvas.open(); полностью блокируется.

Т.е. console.log("foo"); регистрирует "foo", затем открывается окно, и больше ничего не происходит. Только когда я выхожу из окна, выполняется console.log("bar");.

Я хотел бы иметь возможность открывать окно и чтобы Node продолжал выполнять код после вызова, чтобы открыть окно. Было бы здорово, если бы я мог сделать это

const { Canvas } = require("../native");

const canvas = new Canvas();

// logs "foo"
console.log("foo");

// opens the window
canvas.open();

// gets executed right away
console.log("bar");

// other stuff
setTimeout(() => {}, 10000);

// closes the window
canvas.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...