SDL et multithread

SDL et multithread - C - Programmation

Marsh Posté le 19-11-2004 à 11:30:34    

Salut,
 
 
J'ai une application multithread sous linux qui utilise actuellement la bibliotheque X11, et afin de rendre mon programme compatible windows (mais aussi pour avoir quelques fonctionnalités supplémentaires comme le double buffering et la gestion de la transparence), j'ai décidé de changer ma couche graphique et d'utiliser la libSDL.
 
Seulement j'ai quelques soucis au niveau du dessin. En effet, j'ai plusieurs threads qui doivent dessiner. Par exemple le thread principal lorsqu'on appuie sur une touche, mais j'ai egalement un thread de reception de trame sur un port serie et selon le message recu, je peux avoir à redessiner à partir de ce thread de reception.
 
Sous X , pour eviter les acces concurrentiels au display, j'utilisais les fonctions XLockDisplay/XUnlockDisplay lors de toute opération de dessin, et ca se passait tres bien.
 
Je suis passé a SDL, et je n'ai plus acces a ce genre de fonction, et il m'est impossible de faire un SDL_LockSurface sur l'ecran principal (comme ecrit dans la doc). Du coup, dans certains cas, l'application ne peut plus fonctionner. ex : je touche a l ecran pour changer de page, a ce moment la, une trame arrive pour mettre a jour un texte : 2 threads differents font appel a la fonction SDL_BlitSurface, et ca me ressort parfois une erreur du type :
 
Xlib : unexpected async reply.
 
J'ai tenté d'utiliser les sémaphores afin de resoudre le probleme mais apparemment ca n'arrange pas le probleme (il faut dire que je ne maitrise pas le sujet non plus).
 
Y a-t-il un moyen de resoudre ce probleme ? ou alors faut-il que je passe toutes mes operations de dessin dans le thread principal ? (chose qui me parait impossible)
 
 
merci :)

Reply

Marsh Posté le 19-11-2004 à 11:30:34   

Reply

Marsh Posté le 19-11-2004 à 11:45:44    

tu peux faire un système de file d'attente.

Reply

Marsh Posté le 19-11-2004 à 11:46:39    

Y'a déjà eu un topic la-dessus il me semble.

Reply

Marsh Posté le 19-11-2004 à 11:58:37    

je viens d effectuer une recherche sur tous les topic SDL, et il n'y a rien qui puisse m'aider :(

Reply

Marsh Posté le 19-11-2004 à 12:25:59    

c'est threadsafe SDL ? parce que dans GTK, faut pas s'amuser a faire trop de conneries dans differents thread, sinon, on se bouffe le meme genre d'erreur X

Reply

Marsh Posté le 19-11-2004 à 13:37:47    

La documentation est assez imprécise à ce niveau, mais je sens que je vais devoir transformer toute mon application, ou alors trouver une bibliotheque plus adequate mais egalement compatible sous windows (j'en doute).

Reply

Marsh Posté le 19-11-2004 à 14:45:34    

Tu peux peut-être t'en sortir en utilisant les sémaphores (fonctions SDL_Sem*).
 
Exemple tiré de la doc :

Code :
  1. if (SDL_SemWait(my_sem) == -1) {
  2.     return WAIT_FAILED;
  3. }
  4. ...
  5. SDL_SemPost(my_sem);


 
Ça suspend le thread tant que la sémaphore est pas libérée.

Reply

Marsh Posté le 19-11-2004 à 16:15:55    

oui j'ai utilisé ca en initialisant ma sémaphore a 1. Mais apparemment ca ne change rien. Peut etre dois-je en deduire que le probleme vient d'ailleurs.
 
 
Eureka !!! merci, en ecrivant mon post, je viens de m'apercevoir que je n'avais non pas 1 fonction de dessin , mais 2. (une pour les images, et une pour le texte). J'avais mis la semaphore uniquement pour le dessin de mes images , et forcement ca plantait quand du texte etait dessiné , et j'ai pas fait le rapprochement.  
 
 
Bon je reteste ca  :D

Reply

Marsh Posté le 19-11-2004 à 16:25:44    

bon comme prévu, ca marche maintenant. Merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed