Forum de la communauté SFML

Aide => Système => Discussion démarrée par: pascalb le Juin 25, 2014, 06:41:34 am

Titre: Du mal avec les threads
Posté par: pascalb le Juin 25, 2014, 06:41:34 am
Salut j'essaie de faire fonctionner une méthode "update" dans un thread.

Je ne sais pas comment m'y prendre.

main.cpp
#include <SFML/Graphics.hpp>
#include <iostream>

#include "Game.hpp"

struct Params {
        Game g;
        sf::RenderWindow *win;
};

int main(void) {
        sf::RenderWindow window(sf::VideoMode(800,600), ".");
        window.setFramerateLimit(60.f);

        Game game;

        sf::Thread thread(&Game::update, &game);
        thread.launch();

        while (window.isOpen()) {
                sf::Event event;
                while (window.pollEvent(event)) {
                        if (event.type == sf::Event::Closed) window.close();
                }

                window.clear();

                game.render(window);

                window.display();
        }

        thread.terminate();
        thread.wait();
        return 0;
}
 

Game.hpp
#ifndef GAME_HPP
#define GAME_HPP

#include <SFML/Graphics.hpp>
#include <iostream>

class Game {
private:
        sf::RectangleShape m_shape;
        float angle = 0.f;
public:
       Game() {
                m_shape.setSize(sf::Vector2f(100.f,100.f));
                m_shape.setFillColor(sf::Color::Red);
                m_shape.setOrigin(50.f,50.f);
                m_shape.setPosition(400,300);
       }

       void update() {
        while (true) {
                        std::cout << "Update thread!\n";
                        m_shape.setRotation(angle++);
        }
       }

       void render(sf::RenderTarget &window) {
        window.draw(m_shape);
       }
};

#endif // GAME_HPP
 

En fait ça ne fonctionne pas du tout.. Au lieu d'avoir "while (true)" je devrais avoir "while(window->isOpen())" ou quelque chose du genre.. Je ne sais pas comment.
Titre: Re : Du mal avec les threads
Posté par: Laurent le Juin 25, 2014, 07:35:47 am
Citer
En fait ça ne fonctionne pas du tout..
Il va falloir être un peu plus précis... ;)

Et pourquoi utilises-tu un thread ? Normalement tu ne devrais pas en avoir besoin pour faire ça.
Titre: Re : Du mal avec les threads
Posté par: pascalb le Juin 25, 2014, 08:19:21 am
EDIT : J'ai trouvé!

Ce code fonctionne.. il est beau à mes yeux mais je sais pas si je fait quelque chose de mal
#ifndef GAME_HPP
#define GAME_HPP

#include <SFML/Graphics.hpp>
#include <iostream>

class Game {
private:
        sf::RenderWindow m_window;

        sf::Clock m_clock;
        sf::Time m_deltaTime;

        sf::RectangleShape m_shape;
        float m_angle;
public:
        Game() {
                sf::ContextSettings contextSettings;
                contextSettings.antialiasingLevel = 8;
               
                m_window.create(sf::VideoMode(800,600,32), "thread", sf::Style::Close, contextSettings);
                m_window.setFramerateLimit(60.f);
                m_window.setActive(false);
               
                m_shape.setSize(sf::Vector2f(100.f,100.f));
                m_shape.setFillColor(sf::Color::Red);
                m_shape.setOrigin(50.f,50.f);
                m_shape.setPosition(400,300);
               
                m_angle = 0.f;
               
                sf::Thread updateThread(&Game::update, this);
                updateThread.launch();
               
                while (m_window.isOpen()) {
                        sf::Event event;
                        while (m_window.pollEvent(event)) {
                                if (event.type == sf::Event::Closed) m_window.close();
                        }
                }
        }
       
        void update() {
                while (m_window.isOpen()) {
                        m_angle += 2;
                        m_shape.setRotation(m_angle);
                       
                        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) m_shape.move(-2,0);
                        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) m_shape.move(2,0);
                       
                        render();
                        sf::sleep(sf::seconds(1.f/60.f));
                }
        }
       
        void render() {
                m_window.clear();
               
                m_window.draw(m_shape);
               
                m_window.display();
        }
};

#endif // GAME_HPP
 
Titre: Re : Du mal avec les threads
Posté par: Laurent le Juin 25, 2014, 08:44:08 am
Ce n'est pas l'angle total qu'il faut multiplier par le temps écoulé depuis la dernière frame, mais l'incrément (= la variation d'angle que tu appliques durant le temps mesuré).

m_shape.rotate(100 * m_deltaTime.asSeconds());

Citer
Ce code fonctionne.. il est beau à mes yeux mais je sais pas si je fait quelque chose de mal
Non effectivement c'est pas mal. C'est la façon standard de procéder pour s'affranchir du bloquage lors d'un déplacement ou redimensionnement de la fenêtre.

Par contre évite d'éditer tes posts pendant qu'on te répond, ça rend la conversation bizarre à suivre après ;)
Titre: Re : Du mal avec les threads
Posté par: pascalb le Juin 25, 2014, 08:46:52 am
Là je comprend ;) merci beaucoup. Donc comme ça, je n'ai pas besoin de sf::sleep

Et
m_shape.rotate(100 * m_deltaTime.asSeconds());
c'est 100 degrés par seconde