some fixes
This commit is contained in:
parent
896b5bf70c
commit
f6753f2af9
|
|
@ -1,64 +0,0 @@
|
||||||
extern crate gio;
|
|
||||||
extern crate glib;
|
|
||||||
extern crate gtk;
|
|
||||||
|
|
||||||
use gio::prelude::*;
|
|
||||||
use gtk::prelude::*;
|
|
||||||
|
|
||||||
use std::env::args;
|
|
||||||
use std::thread;
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
fn build_ui(application: >k::Application) {
|
|
||||||
let window = gtk::ApplicationWindow::new(application);
|
|
||||||
|
|
||||||
window.set_title("Multithreading GTK+ Program");
|
|
||||||
window.set_border_width(10);
|
|
||||||
window.set_position(gtk::WindowPosition::Center);
|
|
||||||
window.set_default_size(600, 400);
|
|
||||||
|
|
||||||
let text_view = gtk::TextView::new();
|
|
||||||
let scroll = gtk::ScrolledWindow::new(gtk::NONE_ADJUSTMENT, gtk::NONE_ADJUSTMENT);
|
|
||||||
scroll.set_policy(gtk::PolicyType::Automatic, gtk::PolicyType::Automatic);
|
|
||||||
scroll.add(&text_view);
|
|
||||||
|
|
||||||
let (tx, rx) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
|
||||||
|
|
||||||
thread::spawn(move || {
|
|
||||||
for i in 1..100 {
|
|
||||||
// do long work
|
|
||||||
thread::sleep(Duration::from_millis(50));
|
|
||||||
// send result to channel
|
|
||||||
tx.send(format!("#{} Text from another thread.", i))
|
|
||||||
.expect("Couldn't send data to channel");
|
|
||||||
// receiver will be run on the main thread
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Attach receiver to the main context and set the text buffer text from here
|
|
||||||
let text_buffer = text_view
|
|
||||||
.get_buffer()
|
|
||||||
.expect("Couldn't get buffer from text_view");
|
|
||||||
rx.attach(None, move |text| {
|
|
||||||
text_buffer.set_text(&text);
|
|
||||||
|
|
||||||
glib::Continue(true)
|
|
||||||
});
|
|
||||||
|
|
||||||
window.add(&scroll);
|
|
||||||
window.show_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let application = gtk::Application::new(
|
|
||||||
Some("com.github.gtk-rs.examples.multithreading_context"),
|
|
||||||
Default::default(),
|
|
||||||
)
|
|
||||||
.expect("Initialization failed...");
|
|
||||||
|
|
||||||
application.connect_activate(|app| {
|
|
||||||
build_ui(app);
|
|
||||||
});
|
|
||||||
|
|
||||||
application.run(&args().collect::<Vec<_>>());
|
|
||||||
}
|
|
||||||
21
src/lib.rs
21
src/lib.rs
|
|
@ -32,7 +32,7 @@ impl Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Message {
|
enum MessageSerialThread {
|
||||||
Msg(String),
|
Msg(String),
|
||||||
Status(String)
|
Status(String)
|
||||||
}
|
}
|
||||||
|
|
@ -243,7 +243,7 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//avrodith_btn
|
// avrodith_btn
|
||||||
let avrodith_btn = builder.get_object::<gtk::ToolButton>("avrodith_btn").expect("Resource file missing!");
|
let avrodith_btn = builder.get_object::<gtk::ToolButton>("avrodith_btn").expect("Resource file missing!");
|
||||||
|
|
||||||
let tmp_bar = bar.clone();
|
let tmp_bar = bar.clone();
|
||||||
|
|
@ -259,7 +259,7 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//clear_log
|
// clear_log
|
||||||
let clear_log = builder.get_object::<gtk::ToolButton>("clear_log").expect("Resource file missing!");
|
let clear_log = builder.get_object::<gtk::ToolButton>("clear_log").expect("Resource file missing!");
|
||||||
|
|
||||||
let tmp_log_area = log_area.clone();
|
let tmp_log_area = log_area.clone();
|
||||||
|
|
@ -276,7 +276,7 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
send_text(&tmp_config, ent, &tmp_bar);
|
send_text(&tmp_config, ent, &tmp_bar);
|
||||||
});
|
});
|
||||||
|
|
||||||
//send_btn
|
// send_btn
|
||||||
let send_btn = builder.get_object::<gtk::Button>("send_btn").expect("Resource file missing!");
|
let send_btn = builder.get_object::<gtk::Button>("send_btn").expect("Resource file missing!");
|
||||||
|
|
||||||
let tmp_bar = bar.clone();
|
let tmp_bar = bar.clone();
|
||||||
|
|
@ -285,7 +285,7 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
send_text(&tmp_config, &send_entry, &tmp_bar);
|
send_text(&tmp_config, &send_entry, &tmp_bar);
|
||||||
});
|
});
|
||||||
|
|
||||||
// serial
|
// Serial Thread
|
||||||
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
|
||||||
|
|
||||||
let tmp_config = Arc::clone(&config);
|
let tmp_config = Arc::clone(&config);
|
||||||
|
|
@ -297,14 +297,15 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Serial Thread Reciver
|
||||||
let full_log = builder.get_object::<gtk::CheckButton>("full_log").expect("Resource file missing!");
|
let full_log = builder.get_object::<gtk::CheckButton>("full_log").expect("Resource file missing!");
|
||||||
let tmp_graph = Rc::clone(&graph);
|
let tmp_graph = Rc::clone(&graph);
|
||||||
receiver.attach(None, move |msg| {
|
receiver.attach(None, move |msg| {
|
||||||
match msg {
|
match msg {
|
||||||
Message::Msg(text) => {
|
MessageSerialThread::Msg(text) => {
|
||||||
receiver_for_msg(text, &tmp_graph, &full_log, &log_area);
|
receiver_for_msg(text, &tmp_graph, &full_log, &log_area);
|
||||||
},
|
},
|
||||||
Message::Status(text) => {
|
MessageSerialThread::Status(text) => {
|
||||||
bar.push(1, &text);
|
bar.push(1, &text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -330,7 +331,7 @@ pub fn build_ui(app: >k::Application, config: Arc::<Mutex::<Config>>) {
|
||||||
fn serial_thread_work(
|
fn serial_thread_work(
|
||||||
config: &Arc<Mutex<Config>>,
|
config: &Arc<Mutex<Config>>,
|
||||||
bufread: &mut Option<BufReader<Box<dyn serialport::SerialPort>>>,
|
bufread: &mut Option<BufReader<Box<dyn serialport::SerialPort>>>,
|
||||||
sender: &glib::Sender<Message>,
|
sender: &glib::Sender<MessageSerialThread>,
|
||||||
buf: &mut String) {
|
buf: &mut String) {
|
||||||
match config.lock() {
|
match config.lock() {
|
||||||
Ok(mut config) => {
|
Ok(mut config) => {
|
||||||
|
|
@ -342,7 +343,7 @@ fn serial_thread_work(
|
||||||
Status::JAGRIT => {
|
Status::JAGRIT => {
|
||||||
if let Some(read) = bufread {
|
if let Some(read) = bufread {
|
||||||
if let Ok(_) = read.read_line(buf) {
|
if let Ok(_) = read.read_line(buf) {
|
||||||
sender.send(Message::Msg(buf.clone())).unwrap();
|
sender.send(MessageSerialThread::Msg(buf.clone())).unwrap();
|
||||||
buf.clear();
|
buf.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -363,7 +364,7 @@ fn serial_thread_work(
|
||||||
}
|
}
|
||||||
|
|
||||||
}, Err(_) => {
|
}, Err(_) => {
|
||||||
sender.send(Message::Status("Faild prepare for communication!".to_owned())).unwrap();
|
sender.send(MessageSerialThread::Status("Faild prepare for communication!".to_owned())).unwrap();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn start() {
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue