bah j´imagine que ton editeur te donne les lignes de compilation qu´il utilise.
visiblement, le fichier qui contient l´implémentation de ces 2 fonctions manque au projet.
En fait j´ai un gros problème avec Dev-C++ là il plante tout le temps c´est très gênant :x
Je sais pas si c´est à cause du SP2 ou quoi, j´vais essayer une version stable précédente...
J´arrive même pas à trouver où il met les options de linker ou quoi que ce soit en fait xD
Sinon normalement JYY les 2 fonctions sont bien implémentées dans ps2icon.c qui est bien dans le projet :\
Bon j´installe Visual C++ 2005 Express Edition
Moi qui auparavant aimait tant mon p´tit Dev-C++...:´(
Bonjours!
J´ai utilisé les threads pour pouvoir utilisé deux fois de suite l´evennement, mais diferemment.
Et j´ai un warning, ca fonctionne comme je le veux, mais ca me plairais bien qu´il s´en aille
http://rafb.net/paste/results/Jj9USf42.html
J´ai indiqué les lignes Warning.
Voici les erreurs qu´ils m´indiquent :
[Warning] assignment makes pointer from integer without a cast
[Warning] assignment makes pointer from integer without a cast
Apparemment, il y a besoin de pointeurs pour quelque chose...
Merci de m´indiquer ce qui coince ![]()
ta fonction "fonctionThreadBonhomme" retourne un "int", et toi tu colles la valeur de retour dans un SDL_Thread *.
De plus, tu risque de te prendre un autre warning : tes fonctions "fonctionThreadBonhomme" et celle d´en dessous n´ont pas de return. Donc en gros, tes pointeurs Thread1 et Thread2 vont récupérer n´importe quoi (d´ou les warning)
Et ça, c´est des warning a crash : ça veut dire que tu vas cracher de façon aléatoire...
Sinon, je serais toi, je reserverai le multithreading que dans les cas extreme ou ça en vaut vraiment la peine... ![]()
je suis de l´avis de Fvirtman, ne pas utiliser le multi-threading a la légère. C´est assez consommateur de ressource de devoir gerer deux thread.
D´un coté, il y a les changement de contexte pour passer d´un thread a l´autre, mais on est en plus obligé de synchroniser les thread pour qu´il n´y ait pas d´access concurent a une variable.
Je n´utilise quasiment jamais de multithreading. parfois je gère l´affichage de mon jeu de façon découpler du moteur de jeu. Je fais tourner l´affichage a basse priorité et hop voila! Comme c´est toujours le meme qui ecris et le meme qui lit. Bah c´est facil de signaler a l´affichage qu´il devra relire les données avant d´afficher et l´un prend la priorité sur l´autre.
De l´autre coté, je ne fais principalement que du 2D phasé, donc pas tres intensif sur le proc donc bon...
L´autre interet du multithreading c´est d´exploiter les machine moderne multi core (ou virtuellement multi core, je penses au HT) pour faire des calculs plus rapidement. Mais c´est une utilisation compliqué du multithreading (bien que passionante)
en forkant le sujet, j´ajouterais que c´est passionnant, mais pas forcément compliqué.Certains truc commel´API OpenMP permettent de réaliser du multithreading très très simplement.
juste en rajouttant des pragma.
par exemple, la boucle :
for (i=0;i<1000;i++)
str[i]=0;
qui est assez débile je vous l´accorde et qui sera vectorisée par n´importe quel compilateur et parallélisée par n´importe quel bon compilo peut quand même être rendu explicitement parallèle avec un pragma OpenMP :
for (i=0;i<1000;i++)
str[i]=0;
et voila, vous avez une boucle parallel, qui par défaut s´exécutera en autant de morceaux différent qu´il y a de processeurs (ou de coeurs) sur la machine, et avec très peu de surcharge car (par défaut encore) l´allocation des blocs parallèles est faite de manièreplus ou moins statique.
C´est un truc sympa car c´est une norme ouverte, donc n´importe qui peut l´implémenter (même mieux que le C++ car je crois que les spec sont gratuites).
c´est géré par tout les bon compilo, même gcc a un addon (encore en béta) pour le faire.
Merci bien pour ces correction et renseignements.
Mais j´ai pas trouvé d´autres solutions que le multithreading pour gerer ce probleme.
Dans ce jeu tres precis, il faut tester si la touche est enfoncé, ou non enfoncé avec deux touches differentes. A la limite, je met un test en thread, et l´autre comme ca.
Mais je doute que ca fonctionne.
Ca fonctionne parfaitement avec un thread ![]()
dnob, as tu un pointeur sur le document listant ce qui est un pragma valide ou non ?
Pour gérer le clavier, tu n´as pas besoin de cela.
Je te propose une méthode simple :
Tu tiens en mémoire un tableau global de booleans qui contient le statut de toutes les touches.
chaque touche est une case du tableau, regarder si cette case vaut 1 ou 0 permet de voir si elle est enfoncée ou non.
Pour tester si 2 touches sont enfoncées :
if (key(SDLK_ESC) && key(SDLK_h))
{
// ne passe ici que si les 2 touches esc et h so
nt en bas.
}
Apres, tu me diras, comment mettre a jour le tableau ?
Les API (SDL par exemple) propose automatiquement un systeme de file :
chaque fois qu´une touche est enfoncée, un evenement est généré disant "la touche X a été pressée"
chaque fois qu´une touche est relachée, un evenement est généré disant "la touche X a été relachée"
il suffit de regarder la file d´events, et de mettre a jour le tableau.
L´exemple 2.1.4 sur mon site parle de cela. Tu y verras une fonction "UpdateEvents" appelée a chaque début de boucle principale, dont le but est de mettre a jour l´état du clavier.
Une fois a jour, de simples if permettent de voir si une touche est en bas ou non.
Parfait !
Les moments ou j´utilisait pas ce tableau etait la ou j´avais besoin de faire des tests enfoncé/relaché. Grace a toi, j´ai la technique, merci ;)
Euh je viens de remarquer quelque chose :
tu as fait :
int key[400];
j´ai fait :
Uint8 *key = SDL_GetKeyState(NULL);
Quelle est la meileure methode des deux ?
(les deux fonctionnent)
godrik : n´importe quel site sur OpenMP doit faire l´affaire.
j´ai trouvé ça,
http://www.idris.fr/data/cours/parallel/openmp/OpenMP_cours.pdf mais comme jen´ais pas acrobat pour l´instant (je suis en train de réinstaller mon PC) je ne peut pas te dire ce que ça vaut.
en vrac :
http://www.idris.fr/data/cours/parallel/openmp/
http://www.openmp.org/drupal/
sinon, globalement je peut te les donner :
ode.
férent thread dans une région parallélisé
allélise le for dans une région qui ne l´est pas).
c´est les principaux, mais il y en a quelques autr
es (pour synchroniser les différents thread), plus leurs options, plus quelques fonctions (genre omp_set_num_thread) pour modifier le comportement de l´api.
Dnob > Intéressant de parralléliser a coup de pragma ![]()
Surtout que c´est souvent le cas : des tableaux ou il faut faire une opération pour chaque élément, indépendemment des autres.
dynoplasmma > je n´ai pas utilisé SDL_GetKeyState. En fait, je fais mon tableau car je controle tout comme ça
Je ne sais pas exactement ce que fait SDL_GetKeyState : si elle alloc a chaque fois qu´on l´appelle, c´est moins rapide. (mais peut etre qu´elle est tres rapide !) Mais comme j´ai déja mis l´autre méthode dans mon noyau "Futils" (maintenant, je gere meme les joysticks de la meme façon), je la laisse comme ça ![]()
Voila, je n´ai pas bien compris le systeme des des fonctions avec arguments. Par exemple, quelle est la différence entre :
int fonction1 (void)
{ int a;
int b;
}
et entre
int fonction 1 (int a, int b)
{
}
Pardon c´est fonction1 et pas fonction 1.
la 1ere est une fonction sans arguments, qui déclare deux variables locale qui serviront dans la fonction.
la deuxiemme est une fonction qui prend deux argument de type int.
a quoi ça sert donc de passer des arguments a une fonction??
par exemple tu veux une fonction qui calcule la somme de deux nombre
int somme (int a, int b)
{
int res;
res = a+b;
return res;
}
bon c´est tres idiot comme fonction mais on voit bien que cette fonction prend deux variables en arguments (a et b) et se sert d´une variable locale (res).
dans la suite de ton programme tu peux appeler
int s1 = somme(5,6);
// ici s1 vaut 11
et voila
D´accord, merci, je vais tout de suite essayer de le mettre en application.