es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El receptor de canal Fltk no recibe algunos mensajes.

Creo una ventana fltk con un botón. Cuando se hace clic en el botón, se genera un hilo con 10 iteraciones internas. Cada iteración envía un mensaje al canal. Con println!() todo funciona bien, pero si lo elimino, el canal comienza a omitir algunos mensajes.

[dependencies]
fltk = { version="1.2.23", features=["fltk-bundled"] }
fltk-evented = "0.1"
use fltk::{prelude::*, *};
use std::{cell::RefCell, rc::Rc, thread};

fn main() {
    //create channel
    let (mainSender, mainReceiver) = app::channel::<i32>();

    //create application, window, button
    let mainApp = app::App::default();
    let mut win = window::Window::default().with_size(500, 500);
    let mut btn = button::Button::new(20, 20, 100, 40, "START");

    win.end();
    win.show();

    let mainSenderClone = mainSender.clone();

    btn.handle(move |thisBtn, evt| match evt {
        //btn event handler
        enums::Event::Push => {
            //click event

            thread::spawn(move || {
                //create thread

                let mut cnt = 0; //10 iterations
                while (cnt < 10) {
                    mainSenderClone.send(cnt);
                    //println!("sent_from_thread: {}",cnt); - uncommenting this fixes the situation
                    cnt += 1;
                }
            });

            true //event handled
        }

        _ => false, //ignore other events
    });

    //start listening
    while mainApp.wait() {
        if let Some(msg) = mainReceiver.recv() {
            println!("RECEIVED: {}", msg);
        }
    }
}

La salida (sin println!() en el hilo):

RECEIVED: 1
RECEIVED: 3
RECEIVED: 5
RECEIVED: 7
RECEIVED: 9

Con println!():

sent_from_thread: 0
RECEIVED: 0
sent_from_thread: 1
RECEIVED: 1
sent_from_thread: 2
RECEIVED: 2
sent_from_thread: 3
RECEIVED: 3
sent_from_thread: 4
RECEIVED: 4
sent_from_thread: 5
RECEIVED: 5
sent_from_thread: 6
RECEIVED: 6
sent_from_thread: 7
RECEIVED: 7
sent_from_thread: 8
RECEIVED: 8
sent_from_thread: 9
RECEIVED: 9

Tags:  ,

Answer

  1. Avatar for davy.ai

    Q: ¿Cuál es el problema con el canal cuando se elimina println!()?

    Cuando se elimina println!() del hilo, el canal comienza a omitir algunos mensajes. Solo se reciben los mensajes de números impares por el hilo principal, mientras que los mensajes de números pares se pierden.

    Q: ¿Cuál es la solución para corregir este problema?

    La solución es usar mainSender.send_sync(cnt) en lugar de mainSender.send(cnt). Esto asegura que la operación de envío sea sincrónica y bloqueante, por lo que el hilo principal no perderá ningún mensaje. Alternativamente, mantener la declaración println!() en el hilo también soluciona el problema porque introduce una operación de bloqueo, permitiendo que el hilo principal se mantenga al día con los mensajes entrantes.

Comments are closed.