IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Utilisation des mutex et des threads


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Par défaut Utilisation des mutex et des threads
    Bonsoir,
    Je travaille sous Dev C++ 4.9.9.2 et je rencontre actuellement un petit souci avec l'utilisation de mutex dans des threads (j'utilise SDL, aussi). J'ai déjà fouillé sur les discussions qui avaient déjà été lancées mais elles n'apportent pas tout à fait la réponse à mon problème.

    En gros, j'ai une classe principale APPLICATION qui lance plusieurs threads. Afin de pouvoir communiquer entre threads, j'ai aussi mis des files dans ma classe APPLICATION par lesquelles transitent des messages. En très simplifié, le code de ma classe ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class APPLICATION {
    	private:
    		SDL_Thread* monThread;
    		static SDL_mutex* monMutex;
    		static queue<MESSAGE> communication;
    	public:
    		static int fonctionThread(void* data);
    }
    À chaque accès à ma file communication, j'ai décidé de verrouiller à l'aide d'un mutex (monMutex).

    Lorsque je compile tout ça, j'obtiens une série d'erreur undefined reference.... Je fais donc un tour du côté de l'éditeur de liens et m'empresse d'ajouter la ligne -lSDL_mutex. Visiblement, ce n'est pas ça puisque j'obtiens l'erreur cannot find -lSDL_mutex.

    Savez-vous quelle librairie je suis censé importer pour ne plus avoir d'undefined reference ? (si c'est ça mon problème...).
    Jusqu'à présent, lorsque j'utilisais de nouveaux outils, je me référais au web pour connaître la ligne qu'il est parfois nécessaire d'ajouter à l'éditeur de lien pour faire fonctionner certains objets. J'aurai aussi voulu savoir comment on fait pour connaître exactement quelle ligne ajouter à l'éditeur de liens lors d'undefined reference ? (j'ai fouillé plus ou moins dans les répertoires mais rien trouvé).

    Merci d'avance pour vos réponses...

  2. #2
    Membre éprouvé Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Par défaut
    Bonsoir,

    Il n'y a normallement pas de librairie supplémentaire à ajouter pour utiliser SDL_Thread et SDL_mutex.

    As-tu bien rajouter dans l'éditeur de lien -lSDLmain -lSDL (dans cet ordre d'ailleurs si je me souviens bien), car chez moi seul ces deux suffisent (et l'inclusion de <SDL/SDL.h> bien sûr).

    Si oui, peut-être devrais-tu préciser ton message d'erreur, à quoi undefined reference renvoit-il ?

    Et aussi est-ce que ton programme se compilait bien avant que tu n'utilises les Threads ?

    Bon peut-être que je suis à côté de la plaque mais je peux pas t'aider dans ce cas là.

  3. #3
    Membre confirmé Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Par défaut
    J'avais bien inclus les bonnes librairies jusqu'à présent (dont 2 ou 3 pour la SDL) donc ça ne doit pas venir d'ici. Je vais enlever mon -lSDL_mutex et vérifier à quoi mes undefined reference renvoient (il me semble que c'est à chacune des propriétés/méthodes statiques).
    Je redonne plus de détail dès que le test est fait.

    Edit :
    Comme je m'y attendais, les undefined reference renvoient à tout ce qui est déclaré comme statique dans la classe APPLICATION (mutex et files de messages). Les threads étant gérés par des fonctions statiques, étant donné qu'ils ont besoin d'avoir accès aux mutex et files, ces mutex/files doivent bien être déclarés eux aussi comme statiques.
    Je ne vois pas comment faire autrement pour y accéder, hormis peut-être le passage de référence de mutex et de file en paramètre à la fonction de mon thread en faisant quelquechose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static int fonctionThread(void* data) {
    	// ...
    	// contenu de la fonction fonctionThread
    	// ...
    }
     
    // ...
     
    // Lancement du thread
    monThread = SDL_CreateThread(fonctionThread, monMutex, communication);
    mais je ne suis pas certain que ce soit la manière la plus propre (et surtout que ça compile mais c'est un autre problème ).

    Ma question est : existe-t-il un moyen (autre que le passage en paramètre) depuis un thread d'accéder directement aux objets de ma classe APPLICATION (en l'occurence file et mutex) ?
    Autre question : si le passage par paramètre est l'unique solution, est-il possible d'en passer plusieurs, comme à la dernière ligne de l'exemple de code que j'ai donné ?

    Dernière chose dont je viens à l'instant de me rendre compte : la fonction qui gère mon thread fonctionThread est déclarée statique dans APPLICATION.h or dans APPLICATION.cpp, j'ai simplement mis int APPLICATION::fonctionThread(void* data). Plus j'y réléchis et plus je m'y perds. Est-ce qu'il serait possible de me dire quelles modifs apporter à mon exemple pour avoir :
    • un thread géré par une fonction membre de APPLICATION (c'est-à-dire fonctionThread = fonction membre de APPLICATION)
    • un accès au mutex depuis le thread (mutex déclaré privé dans APPLICATION)
    • un accès à la file depuis le thread (file aussi privée)


    Merci...

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    En utilisant Boost.Thread et Boost.Function

    Tu devrais pourvoir lancer un thread sur une fonction membre non static de ta classe qui aura donc accès aux membres de ta classe.

  5. #5
    Membre confirmé Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Par défaut
    Merci beaucoup pour ces liens. Je regarde ça dès que j'ai le temps (début de semaine prochaine je pense) et je vous tiens au courant de ce que j'aurai pu faire.

    ______________
    Edit...
    Du nouveau depuis la dernière fois. J'ai pu réfléchir calmement à mon problème et je me suis trouvé la solution suivante. Tout d'abord, au niveau des classes :
    • J'ai une classe APPLICATION.
    • Je me suis créé une classe FILE_MESSAGE, qui me permet de gérer une file de d'évenements (et donc de communication entre les threads).


    La classe APPLICATION lance des threads, lesquels sont gérés par des fonctions statiques à part. Voici d'ailleurs la ligne qui me permet de lancer un thread depuis ma classe APPLICATION :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monThread = SDL_CreateThread(fonctionThread, this);
    Le thread ainsi créé possède donc un pointeur vers mon instance d'APPLICATION et peut donc communiquer avec.

    Je suis conscient de ne pas avoir forcément utilisé la meilleure méthode (Boost semblait très intéressant : désolé, je n'y ai jeté qu'un rapide coup d'oeil) et c'est surtout par manque de temps en ce moment. J'espère plus tard trouver le moment pour me pencher sur la question...

    Merci pour vos réponses...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser JOGL + shader pour des effets sur des images 2D.
    Par nouknouk dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 19/12/2007, 10h46
  2. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  3. Réponses: 3
    Dernier message: 23/01/2007, 08h14
  4. Utilisation du Enable avec des combobox ou des listbox
    Par legos dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 19/09/2006, 22h35
  5. Réponses: 2
    Dernier message: 27/04/2006, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo