From 1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 19 Oct 2020 14:44:55 +0200 Subject: Load thumbnails with multiple threads, use sha256 for saving image to path instead of base64 (filename limit is 256 on linux...) --- include/AsyncImageLoader.hpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'include/AsyncImageLoader.hpp') diff --git a/include/AsyncImageLoader.hpp b/include/AsyncImageLoader.hpp index 0b3f4bf..3189565 100644 --- a/include/AsyncImageLoader.hpp +++ b/include/AsyncImageLoader.hpp @@ -1,11 +1,16 @@ #pragma once -#include +#include "../include/Storage.hpp" #include #include #include +#include +#include #include #include +#include +#include +#include namespace QuickMedia { enum class LoadingState { @@ -23,15 +28,36 @@ namespace QuickMedia { sf::Clock texture_applied_time; }; + constexpr int NUM_IMAGE_LOAD_THREADS = 4; + class AsyncImageLoader { public: + AsyncImageLoader(); + ~AsyncImageLoader(); // Returns false if the image loader is already loading an image. In that case, this function should be called again later. // set |resize_target_size| to {0, 0} to disable resizing. // |thumbnail_data.loading_state| has to be LoadingState::NOT_LOADED when calling this! // Note: this method is not thread-safe - bool load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr thumbnail_data); + void load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr thumbnail_data); + private: + struct ThumbnailLoadData { + Path path; + Path thumbnail_path; + bool local; + std::shared_ptr thumbnail_data; + sf::Vector2i resize_target_size; + }; + + // Returns -1 if all threads are busy + int get_free_load_index() const; private: - bool loading_image = false; + bool loading_image[NUM_IMAGE_LOAD_THREADS]; + // TODO: Use curl single-threaded multi-download feature instead + std::thread download_image_thread[NUM_IMAGE_LOAD_THREADS]; std::thread load_image_thread; + std::mutex load_image_mutex; + std::condition_variable load_image_cv; + std::deque images_to_load; + bool running = true; }; } \ No newline at end of file -- cgit v1.2.3