From 2c5e1d946060720815022600e306c0a81a56d5e7 Mon Sep 17 00:00:00 2001 From: D1MENSI0N Date: Sat, 6 Feb 2021 20:43:24 +0100 Subject: [PATCH] Threads fix --- includes/simulation.h | 25 +++++++++++++------------ includes/utils.h | 6 +++--- sources/simulation.cpp | 14 ++++++++++---- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/includes/simulation.h b/includes/simulation.h index 98e1579..0ebaeb1 100644 --- a/includes/simulation.h +++ b/includes/simulation.h @@ -9,18 +9,19 @@ class Simulation { public: - sf::Image void_image; // Image vide - std::array images; // Images où s'affiche la fractale - std::array, THREAD_NB> finished; // Indique pour chaque thread si il a terminé - sf::Texture texture; // Texture supportant l'image - sf::Sprite sprite; // Sprite servant à afficher la texture - uint8_t fractal_type; // Type de fractale (0 : Mandelbrot, 1 : Julia) - std::array sequence_types; // Type de séquence (lié à fractal_type) - Vector position; // Position de la vue - double zoom; // Taille de la vue - std::vector julia_examples; // Liste d'exemples d'ensembles de Julia - uint8_t example_index; // Index de la liste d'exemples - bool change; // Dit si il y a eu un changement dans la vue + sf::Image void_image; // Image vide + std::vector images; // Images où s'affiche la fractale + std::vector> finished; // Indique pour chaque thread si il a terminé + uint8_t thread_nb; // Nombre de coeurs utilisés par le CPU + sf::Texture texture; // Texture supportant l'image + sf::Sprite sprite; // Sprite servant à afficher la texture + uint8_t fractal_type; // Type de fractale (0 : Mandelbrot, 1 : Julia) + std::array sequence_types; // Type de séquence (lié à fractal_type) + Vector position; // Position de la vue + double zoom; // Taille de la vue + std::vector julia_examples; // Liste d'exemples d'ensembles de Julia + uint8_t example_index; // Index de la liste d'exemples + bool change; // Dit si il y a eu un changement dans la vue Simulation(); diff --git a/includes/utils.h b/includes/utils.h index 2f611d7..7a1d312 100644 --- a/includes/utils.h +++ b/includes/utils.h @@ -21,12 +21,12 @@ class Complex; #define WIDTH 1920 // Largeur de l'écran #define HEIGHT 1080 // Hauteeur de l'écran #define RESIZE ((1. / 1920.) * screen_width) // Coéfficent en fonction de la taille de l'écran +#define FREE_THREAD 2 // -#define MANDELBROT 0 // -#define JULIA 1 // +#define MANDELBROT 0 +#define JULIA 1 #define SEQUENCE_MAX 2.2 // Valeur limite du modulo du complexe pour arrêter la suite #define SEQUENCE_MAX2 5. // Carré de la valeur limite du modulo du complexe pour arrêter la suite -#define THREAD_NB 16 // Nombre de coeurs utilisés par le CPU #define HSV_MIN 185 // Couleur min #define HSV_MAX 271 // Couleur max diff --git a/sources/simulation.cpp b/sources/simulation.cpp index b39eec3..4c06c17 100644 --- a/sources/simulation.cpp +++ b/sources/simulation.cpp @@ -6,7 +6,11 @@ Simulation::Simulation() { void_image.create(WIDTH, HEIGHT, sf::Color(0, 0, 0, 0)); - images.fill(void_image); + thread_nb = std::max((int)std::thread::hardware_concurrency() - FREE_THREAD, 1); + + images.assign(thread_nb, void_image); + + finished = std::vector>(thread_nb); std::fill(finished.begin(), finished.end(), false); texture.create(WIDTH, HEIGHT); @@ -127,13 +131,15 @@ void Simulation::simulate(My_event& my_event) { bool image_finished = true; - images.fill(void_image); + images.assign(thread_nb, void_image); + + finished = std::vector>(thread_nb); std::fill(finished.begin(), finished.end(), false); - std::array threads; + std::vector threads(thread_nb); for (uint8_t i = 0; i < threads.size(); i++) - threads[i] = std::thread([this, i]() { draw_fractal((HEIGHT / static_cast(THREAD_NB)) * i, (HEIGHT / static_cast(THREAD_NB)) * (i + 1), i); }); + threads[i] = std::thread([this, i]() { draw_fractal((HEIGHT / static_cast(thread_nb)) * i, (HEIGHT / static_cast(thread_nb)) * (i + 1), i); }); while (!std::all_of(finished.begin(), finished.end(), [](bool i) -> bool { return i; })) if (!my_event.check())