Skip to content

Commit

Permalink
Threads fix
Browse files Browse the repository at this point in the history
  • Loading branch information
angeluriot committed Feb 6, 2021
1 parent 7a48293 commit 2c5e1d9
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 19 deletions.
25 changes: 13 additions & 12 deletions includes/simulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,19 @@ class Simulation
{
public:

sf::Image void_image; // Image vide
std::array<sf::Image, THREAD_NB> images; // Images où s'affiche la fractale
std::array<std::atomic<bool>, 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_type, 2> sequence_types; // Type de séquence (lié à fractal_type)
Vector position; // Position de la vue
double zoom; // Taille de la vue
std::vector<Complex> 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<sf::Image> images; // Images où s'affiche la fractale
std::vector<std::atomic<bool>> 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_type, 2> sequence_types; // Type de séquence (lié à fractal_type)
Vector position; // Position de la vue
double zoom; // Taille de la vue
std::vector<Complex> 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();

Expand Down
6 changes: 3 additions & 3 deletions includes/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 10 additions & 4 deletions sources/simulation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::atomic<bool>>(thread_nb);
std::fill(finished.begin(), finished.end(), false);

texture.create(WIDTH, HEIGHT);
Expand Down Expand Up @@ -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<std::atomic<bool>>(thread_nb);
std::fill(finished.begin(), finished.end(), false);

std::array<std::thread, THREAD_NB> threads;
std::vector<std::thread> threads(thread_nb);

for (uint8_t i = 0; i < threads.size(); i++)
threads[i] = std::thread([this, i]() { draw_fractal((HEIGHT / static_cast<double>(THREAD_NB)) * i, (HEIGHT / static_cast<double>(THREAD_NB)) * (i + 1), i); });
threads[i] = std::thread([this, i]() { draw_fractal((HEIGHT / static_cast<double>(thread_nb)) * i, (HEIGHT / static_cast<double>(thread_nb)) * (i + 1), i); });

while (!std::all_of(finished.begin(), finished.end(), [](bool i) -> bool { return i; }))
if (!my_event.check())
Expand Down

0 comments on commit 2c5e1d9

Please sign in to comment.