h-gtk/utils: Use a threadpool to avoid spawning a million threads

This commit is contained in:
Jordan Petridis 2018-03-29 10:24:02 +03:00
parent 88cc7e6fec
commit 8703470010
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
2 changed files with 5 additions and 4 deletions

View File

@ -26,15 +26,14 @@ extern crate hammond_downloader;
extern crate humansize; extern crate humansize;
extern crate loggerv; extern crate loggerv;
extern crate open; extern crate open;
extern crate rayon;
extern crate regex; extern crate regex;
extern crate reqwest; extern crate reqwest;
extern crate send_cell; extern crate send_cell;
extern crate serde_json; extern crate serde_json;
extern crate take_mut; extern crate take_mut;
extern crate url; extern crate url;
// extern crate rayon;
// use rayon::prelude::*;
use log::Level; use log::Level;
use gtk::prelude::*; use gtk::prelude::*;

View File

@ -7,6 +7,7 @@ use gtk;
use gtk::prelude::*; use gtk::prelude::*;
use failure::Error; use failure::Error;
use rayon;
use regex::Regex; use regex::Regex;
use reqwest; use reqwest;
use send_cell::SendCell; use send_cell::SendCell;
@ -132,6 +133,7 @@ fn refresh_feed(source: Option<Vec<Source>>, sender: Sender<Action>) -> Result<(
lazy_static! { lazy_static! {
static ref CACHED_PIXBUFS: RwLock<HashMap<(i32, u32), Mutex<SendCell<Pixbuf>>>> = static ref CACHED_PIXBUFS: RwLock<HashMap<(i32, u32), Mutex<SendCell<Pixbuf>>>> =
{ RwLock::new(HashMap::new()) }; { RwLock::new(HashMap::new()) };
static ref THREADPOOL: rayon::ThreadPool = rayon::ThreadPoolBuilder::new().build().unwrap();
} }
// Since gdk_pixbuf::Pixbuf is refference counted and every episode, // Since gdk_pixbuf::Pixbuf is refference counted and every episode,
@ -161,12 +163,12 @@ pub fn set_image_from_path(
let (sender, receiver) = channel(); let (sender, receiver) = channel();
let pd_ = pd.clone(); let pd_ = pd.clone();
thread::spawn(move || { THREADPOOL.spawn(move || {
sender.send(downloader::cache_image(&pd_)).unwrap(); sender.send(downloader::cache_image(&pd_)).unwrap();
}); });
let image = image.clone(); let image = image.clone();
gtk::timeout_add(200, move || { gtk::timeout_add(50, move || {
if let Ok(path) = receiver.try_recv() { if let Ok(path) = receiver.try_recv() {
if let Ok(path) = path { if let Ok(path) = path {
if let Ok(px) = if let Ok(px) =