No more thread blocking for receiving data
parent
ed012e40b1
commit
5dbaef1dec
106
src/main.rs
106
src/main.rs
|
@ -1,5 +1,5 @@
|
||||||
use std::{
|
use std::{
|
||||||
sync::mpsc::{self, Sender},
|
sync::mpsc::{self, Receiver, Sender},
|
||||||
thread,
|
thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,67 +16,104 @@ use rand::Rng;
|
||||||
const SIZE: u32 = 50;
|
const SIZE: u32 = 50;
|
||||||
const MAX_VALUE: f64 = 100.0;
|
const MAX_VALUE: f64 = 100.0;
|
||||||
|
|
||||||
type Sorter = fn(SortVisualizer);
|
type Sorter = fn(&mut SortVisualizer);
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug)]
|
||||||
struct SortVisualizer {
|
struct SortVisualizer {
|
||||||
chart: Chart,
|
|
||||||
arr: Vec<f64>,
|
arr: Vec<f64>,
|
||||||
|
chart: Chart,
|
||||||
sorter: Sorter,
|
sorter: Sorter,
|
||||||
tx: Sender<SortVisualizer>,
|
tx: Sender<Vec<f64>>,
|
||||||
|
rx: Receiver<Vec<f64>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SortVisualizer {
|
impl SortVisualizer {
|
||||||
fn new(tx: Sender<SortVisualizer>, arr: Vec<f64>, sorter: Sorter) -> Self {
|
fn new(id: usize, arr: Vec<f64>, sorter: Sorter) -> Self {
|
||||||
|
let (tx, rx) = mpsc::channel();
|
||||||
|
let y = 300 * (id) as i32;
|
||||||
|
|
||||||
let mut chart = Chart::default();
|
let mut chart = Chart::default();
|
||||||
|
chart.set_pos(0, y);
|
||||||
chart.set_size(500, 250);
|
chart.set_size(500, 250);
|
||||||
chart.set_frame(FrameType::FlatBox);
|
chart.set_frame(FrameType::FlatBox);
|
||||||
chart.set_bounds(0.0, MAX_VALUE);
|
chart.set_bounds(0.0, MAX_VALUE);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
tx,
|
|
||||||
chart,
|
|
||||||
arr,
|
arr,
|
||||||
|
chart,
|
||||||
sorter,
|
sorter,
|
||||||
|
tx,
|
||||||
|
rx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sort(self) {
|
fn sort(&mut self) {
|
||||||
(self.sorter)(self);
|
(self.sorter)(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn redraw(&mut self) {
|
fn draw(&mut self, arr: Vec<f64>) {
|
||||||
self.chart.clear();
|
self.chart.clear();
|
||||||
for i in &self.arr {
|
for i in &arr {
|
||||||
self.chart.add(*i, "", Color::Cyan);
|
self.chart.add(*i, "", Color::Cyan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn quick_sort(arr: &mut Vec<f64>, vis: &mut SortVisualizer) {}
|
fn quick_sort(vis: &mut SortVisualizer) {
|
||||||
|
let n = vis.arr.len();
|
||||||
|
let low = 0;
|
||||||
|
let high = n - 1;
|
||||||
|
|
||||||
fn bubble_sort(mut vis: SortVisualizer) {
|
quick_sorting(vis, low, high);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn quick_sorting(vis: &mut SortVisualizer, low: usize, high: usize) {
|
||||||
|
if low < high {
|
||||||
|
let pivot = partition(vis, low, high);
|
||||||
|
if pivot > 0 {
|
||||||
|
quick_sorting(vis, low, pivot - 1);
|
||||||
|
}
|
||||||
|
quick_sorting(vis, pivot + 1, high);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn partition(vis: &mut SortVisualizer, low: usize, high: usize) -> usize {
|
||||||
|
let pivot = high;
|
||||||
|
let mut i = low as isize - 1;
|
||||||
|
|
||||||
|
for j in low..high {
|
||||||
|
if vis.arr[j] < vis.arr[pivot] {
|
||||||
|
i += 1;
|
||||||
|
vis.arr.swap(i as usize, j);
|
||||||
|
vis.tx.send(vis.arr.clone()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vis.arr.swap((i + 1) as usize, pivot);
|
||||||
|
vis.tx.send(vis.arr.clone()).unwrap();
|
||||||
|
|
||||||
|
(i + 1) as usize
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bubble_sort(vis: &mut SortVisualizer) {
|
||||||
let n = vis.arr.len();
|
let n = vis.arr.len();
|
||||||
|
|
||||||
for i in 0..n {
|
for i in 0..n {
|
||||||
for j in 0..n - i - 1 {
|
for j in 0..n - i - 1 {
|
||||||
if vis.arr[j] > vis.arr[j + 1] {
|
if vis.arr[j] > vis.arr[j + 1] {
|
||||||
vis.arr.swap(j, j + 1);
|
vis.arr.swap(j, j + 1);
|
||||||
|
vis.tx.send(vis.arr.clone()).unwrap();
|
||||||
vis.tx.send(vis.clone()).unwrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut arr: Vec<f64> = (1..SIZE)
|
let arr: Vec<f64> = (1..SIZE)
|
||||||
.map(|_| rand::rng().random_range(1.0..MAX_VALUE))
|
.map(|_| rand::rng().random_range(1.0..MAX_VALUE))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let (tx, rx) = mpsc::channel();
|
let sorts = [quick_sort, bubble_sort];
|
||||||
|
|
||||||
let sorts = [bubble_sort];
|
|
||||||
// let mut visualizers = vec![];
|
|
||||||
|
|
||||||
let app = app::App::default().with_scheme(app::Scheme::Gtk);
|
let app = app::App::default().with_scheme(app::Scheme::Gtk);
|
||||||
let theme = ColorTheme::new(&color_themes::fleet::DARK1);
|
let theme = ColorTheme::new(&color_themes::fleet::DARK1);
|
||||||
|
@ -87,20 +124,29 @@ fn main() {
|
||||||
.with_label("FLTK Visualizer");
|
.with_label("FLTK Visualizer");
|
||||||
window.size_range(640, 480, 0, 0);
|
window.size_range(640, 480, 0, 0);
|
||||||
|
|
||||||
let mut vis = SortVisualizer::new(tx, arr, bubble_sort);
|
let mut visualizers = vec![];
|
||||||
// visualizers.push(vis);
|
|
||||||
|
for (i, sort) in sorts.into_iter().enumerate() {
|
||||||
|
visualizers.push(SortVisualizer::new(i, arr.clone(), sort));
|
||||||
|
}
|
||||||
|
|
||||||
|
thread::scope(|scope| {
|
||||||
|
for sorter in &mut visualizers {
|
||||||
|
scope.spawn(move || {
|
||||||
|
sorter.sort();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
window.end();
|
window.end();
|
||||||
window.show();
|
window.show();
|
||||||
|
|
||||||
let handle = thread::spawn(move || {
|
|
||||||
vis.sort();
|
|
||||||
});
|
|
||||||
|
|
||||||
app::add_idle3(move |_| {
|
app::add_idle3(move |_| {
|
||||||
let vis = rx.recv();
|
for sorter in &mut visualizers {
|
||||||
if let Ok(mut vis) = vis {
|
let arr = sorter.rx.try_recv();
|
||||||
vis.redraw();
|
if let Ok(arr) = arr {
|
||||||
|
sorter.draw(arr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.redraw();
|
window.redraw();
|
||||||
|
@ -108,6 +154,4 @@ fn main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
app.run().unwrap();
|
app.run().unwrap();
|
||||||
|
|
||||||
handle.join().unwrap();
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue