Forum de la communauté SFML

Aide => Système => Discussion démarrée par: LeParp le Octobre 18, 2014, 08:39:47 pm

Titre: Erreur de segmentation avec Thread.wait()
Posté par: LeParp le Octobre 18, 2014, 08:39:47 pm
Bonsoir,
Je viens demander conseil à propos d'une erreur :
J'ai utilisé un système de thread pour créer un jeu ; l'affichage de ma fenêtre se fait dans un thread parallèle asynchrone. J'ai deux possibilités lorsque ma fenêtre s'ouvre : si j'appuie sur une touche, la fenêtre se ferme, tout semble se passer normalement malgré un petit lag à la fin. Cependant, si j'appuie sur une autre touche, mon jeu redémarre : la fenêtre se ferme puis se réouvre, alors que mon thread s'arrête puis redémarre : là mon programme crash.

J'ai pisté l'erreur au débugger, elle survient lors de l'appel à mThread.wait(). Si je supprime cet appel, elle semble survenir à la destruction de l'objet. Voilà ce que m'affiche Code Blocks :
Program received signal SIGSEGV, Segmentation fault.
In _pthread_cleanup_dest () ()

Je pense tenter de reproduire cet erreur avec un code minimal, je voulais cependant savoir si quelqu'un pourrait m'indiquer où chercher ou même me dire d'où peut provenir cette erreur ?
Merci, bonne soirée.
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: Laurent le Octobre 18, 2014, 09:04:28 pm
Citer
Je pense tenter de reproduire cet erreur avec un code minimal
Fais donc ça. On ne va pas commencer à se remuer les méninges sans code, alors que tu t'apprêtes à en poster un complet minimal ;)
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: LeParp le Octobre 18, 2014, 11:01:34 pm
Tout d'abord, merci Laurent pour ton bon conseil de toujours chercher à obtenir un code minimal ! Ce fut beaucoup moins difficile que je ne m'y attendait de passer de 600 à 22 lignes de codes pour reproduire l'erreur, et le code que j'ai obtenu ne se devine pas...

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

void run()
{
    //sf::Clock clock2;
    sf::VideoMode video_mode2(800, 600);
}

int main()
{
    //sf::Clock clock1;
    sf::VideoMode video_mode1(800, 600);

    sf::Thread thread(&run);

    thread.launch();
    thread.wait();

    return 0;
}
 

J'ai mis en commentaire la création de clock1 et de clock2, c'est ici que ça devient intéressant. Après quelques test, en commentant alternativement clock1, clock2, video_mode1 et video_mode2, je me suis aperçu que l'erreur apparaît dans un cas très précis : lorsque dans un thread (soit le principale soit le secondaire), au moins l'un des video_mode n'est pas commenté, et que dans l'autre thread, video_mode ou clock n'est pas commenté.

N'hésitez pas à donner des réactions ou à demander plus de détails !
Je me demande si je suis le seul à trouver cette erreur totalement bizarre. ???

Note : si j’exécute le programme sans le debbuger tout semble se dérouler normalement, mais l'erreur est toujours la même avec celui-ci.
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: Laurent le Octobre 19, 2014, 10:33:23 am
Quel OS ? Quelle version de SFML ?
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: LeParp le Octobre 19, 2014, 07:11:25 pm
Windows 8, SFML 2.1

Faut-il que je mette à jour SFML ? Il semble que j'ai compilé la version que j'utilise moi-même, peut être que des corrections ont été apportées depuis ?
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: Laurent le Octobre 19, 2014, 07:35:51 pm
J'en doute, mais tu peux toujours essayer, oui. En tout cas je ne vois pas du tout ce qui peut foirer.
Titre: Re : Erreur de segmentation avec Thread.wait()
Posté par: LeParp le Octobre 19, 2014, 07:54:26 pm
Après quelques test, je me rends compte que je n'arrive pas à reproduire le crash en lançant mon programme en dehors de Code::Blocks. On peut considérer le problème comme résolu pour l'instant, si je ne donne pas de nouvelle c'est que tout vas bien. :)