diff options
author | dec05eba <dec05eba@protonmail.com> | 2020-10-19 14:44:55 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2020-10-19 14:44:55 +0200 |
commit | 1569d02aa38baa53d5442b3babdbf1a3aaa3aaa0 (patch) | |
tree | e2d58b2ad86168c238f996e699097ca1d3991a47 /include/AsyncImageLoader.hpp | |
parent | 1ea92d1aa4656160fee3059500c405ce4260bce7 (diff) |
Load thumbnails with multiple threads, use sha256 for saving image to path instead of base64 (filename limit is 256 on linux...)
Diffstat (limited to 'include/AsyncImageLoader.hpp')
-rw-r--r-- | include/AsyncImageLoader.hpp | 32 |
1 files changed, 29 insertions, 3 deletions
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 <string> +#include "../include/Storage.hpp" #include <SFML/System/Vector2.hpp> #include <SFML/Graphics/Texture.hpp> #include <SFML/System/Clock.hpp> +#include <string> +#include <vector> #include <memory> #include <thread> +#include <mutex> +#include <condition_variable> +#include <deque> 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<ThumbnailData> thumbnail_data); + void load_thumbnail(const std::string &url, bool local, sf::Vector2i resize_target_size, bool use_tor, std::shared_ptr<ThumbnailData> thumbnail_data); + private: + struct ThumbnailLoadData { + Path path; + Path thumbnail_path; + bool local; + std::shared_ptr<ThumbnailData> 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<ThumbnailLoadData> images_to_load; + bool running = true; }; }
\ No newline at end of file |