Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Du mal avec les threads  (Lu 2736 fois)

0 Membres et 1 Invité sur ce sujet

pascalb

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Du mal avec les threads
« 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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Du mal avec les threads
« Réponse #1 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.
Laurent Gomila - SFML developer

pascalb

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Du mal avec les threads
« Réponse #2 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
 
« Modifié: Juin 25, 2014, 08:44:16 am par pascalb »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Du mal avec les threads
« Réponse #3 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 ;)
« Modifié: Juin 25, 2014, 08:46:06 am par Laurent »
Laurent Gomila - SFML developer

pascalb

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Du mal avec les threads
« Réponse #4 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
« Modifié: Juin 25, 2014, 08:53:11 am par pascalb »