Winit.rs Запуск и хранение окна внутри структуры

Я изучаю vulkan + winit используя документацию Vulkan Triangle

Я стараюсь так же использовать ООП и сделал некую копию структуры с парочкой функций внутри.

use vulkano::instance::Instance;
use vulkano::instance::InstanceExtensions;

use vulkano_win::VkSurfaceBuild;

use winit::{
    event::{Event, WindowEvent},
    event_loop::{ControlFlow, EventLoop},
    window::{
        Window,
    },
};
use vulkano_win::CreationError::WindowCreationError;

struct HelloTriangleApplication {
    event_loop: EventLoop<()>,
    window: Window,
}

impl HelloTriangleApplication {
    pub fn run(&mut self){
        self.init_window();
        self.init_vulkan();
        self.init_loop();

        println!("Application started successful!");
    }

    fn init_window(&mut self) {
        println!("Window initialization...");

        self.event_loop = EventLoop::new();
        self.window = Window::new(&self.event_loop)
            .unwrap();
    }

    fn init_vulkan(&mut self) {
        println!("Vulkan initialization...");
    }

    fn init_loop(&mut self){
        println!("Loop initialization...");

        self.event_loop.run(move |event, _, control_flow| {
            // ControlFlow::Poll continuously runs the event loop, even if the OS hasn't
            // dispatched any events. This is ideal for games and similar applications.
            *control_flow = ControlFlow::Poll;

            // ControlFlow::Wait pauses the event loop if no events are available to process.
            // This is ideal for non-game applications that only update in response to user
            // input, and uses significantly less power/CPU time than ControlFlow::Poll.
            //*control_flow = ControlFlow::Wait;

            match event {
                Event::WindowEvent {
                    event: WindowEvent::CloseRequested,
                    ..
                } => {
                    println!("The close button was pressed; stopping");
                    *control_flow = ControlFlow::Exit
                },
                Event::MainEventsCleared => {
                    // Application update code.
                    // Queue a RedrawRequested event.
                    self.window.request_redraw();
                },
                Event::RedrawRequested(_) => {
                    // Redraw the application.
                },
                _ => ()
            }
        });
    }
}

fn main() {

    //--------------------------------------------------------------------------------------------//
    //let app = HelloTriangleApplication::initialize();
    let mut app = HelloTriangleApplication;
    app.run();
}

При запуске я получаю ошибку: cannot infer an appropriate lifetime due to conflicting requirements struct

Если я правильно понял, проблема в том, что выполнение event_loop.run() живёт дольше, чем структура. Но для меня это абстрактная информация. Не совсем понимаю как её решить.

Объясните пожалуйста как решить проблему и удачно запустить программу?


Ответы (0 шт):