• STATISTIQUES
  • Il y a eu un total de 3 membres et 9082 visiteurs sur le site dans les dernières 24h pour un total de 9 085 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] wechall
    Pour les gens n'étant pas familiers avec les sites de challenges, un site de challenges est un site propos...
    Hacking
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] Rosecode
    Programming: 36, Math: 29, Probability: 5, Sequence: 7, Crypto: 4, Brainf**k: 13, TimeRace: 4, Hack: 9
    Challenges
    [EN] Sabre Films
    Site de challenge présenté sous la forme d'une quête. Vous êtes un détective et devrez résoudre d...
    Challenges
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] This is legal
    Basic: 10, Realistic: 5, Programming: 1, Bonus: 11, SQL: 2, Encryption: 6, Application: 4, User Contributed: 3
    Challenges
    [FR] frameip
    le site de partage des connaissances du monde TCPIP
    Protocole

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C][SDL]Exécuter deux fonctions en même temps
26-12-2013, 21h24 (Modification du message : 26-12-2013, 21h24 par InFamouZz.)
Message : #1
InFamouZz Hors ligne
Membre actif
*



Messages : 76
Sujets : 21
Points: 3
Inscription : Dec 2011
[C][SDL]Exécuter deux fonctions en même temps
Salut a tous,
Je travail depuis un bon moment sur un projet SDL ( création d'un jeux video de course en 2D type taxidriver ... ) Mais je suis bloqué a un point qui est très peux évoqué en SDL.

En effet j'ai coder deux fonction :
- une fonction "tombe" qui fais apparaitre des voitures ( en blitants et libérant au fur et a mesure ) du haut de l'écran jusqu'en bas

- une fonction "changement" qui vas changer la voie de circulation de la voiture du joueur ( en blitants et libérant au fur et a mesure comme avant jusqu'a arriver a la bonne voie en fonction de la saisie de l'utilisateur).

Mais mon problème est d'exécuter ses deux fonction en même temps, après m'être renseigner j'ai entendu parler de THEARD mais je ne sais pas comment elle marche, n'y ou en trouver une document ( pas trop complexe ^^ )
+1 (0) -1 (0) Répondre
27-12-2013, 00h00
Message : #2
Hypnoze57 Hors ligne
Web Hacker
*



Messages : 98
Sujets : 13
Points: 28
Inscription : Feb 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
Je crois qu'openMP permet le multi threading (bien que je n'en ai jamais fais)
Make your own destiny now and forever !
+1 (0) -1 (0) Répondre
27-12-2013, 00h26
Message : #3
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
salut InFamouZz,

(26-12-2013, 21h24)InFamouZz a écrit : (...) jeux video de course en 2D type taxidriver (...)

le seul Taxi Driver que je connais c'est celui avec De Niro, t'as des photos ?

Citation :En effet j'ai coder deux fonction (...) une qui fais apparaitre des voitures (...) une qui vas changer la voie de circulation de la voiture du joueur (...) mon problème est d'exécuter ses deux fonction en même temps

vu d'ici les threads ne sont pas la solution, il te faut penser/tourner ton code différement, c'est pas "la route défile et y'a plusieurs actions en simultané", c'est plutôt "qu'est-ce que j'affiche à chaque image"
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (0) Répondre
27-12-2013, 00h38 (Modification du message : 27-12-2013, 00h41 par InFamouZz.)
Message : #4
InFamouZz Hors ligne
Membre actif
*



Messages : 76
Sujets : 21
Points: 3
Inscription : Dec 2011
RE: [C][SDL]Exécuter deux fonctions en même temps
j'avais pensé à ça mais le problème est que dans mes deux fonctions ce sont des boucles qui affichage et libère donc quand tu exécute une des deux fonctions tu est obliger d'attendre que sa boucle soit finie pour pour pouvoir exécuter l'autre fonction , et je ne vois pas de moyen sans threads de le faire.
De plus notre prof nous avais dis de regarder les threads pour ce projet.
+1 (0) -1 (0) Répondre
27-12-2013, 01h06 (Modification du message : 27-12-2013, 01h06 par Sh4dows.)
Message : #5
Sh4dows Hors ligne
Tweetos
*



Messages : 293
Sujets : 5
Points: 49
Inscription : Dec 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
Il me semblait que la SDL embarquait un système de threading.. Tu as fais le tour des fonctions disponible ? Certaines pourraient "peut être" t'aider à faire ce que tu veux.

Sinon tu peux utiliser les timers à gogo Rolleyes
Si tu veux quand même du threading, pthreads est pas mal (nux).
Faites ce que je dis et non ce que je fais !
+1 (0) -1 (0) Répondre
27-12-2013, 09h38
Message : #6
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
(27-12-2013, 00h38)InFamouZz a écrit : je ne vois pas de moyen sans threads de le faire.

sur le principe c'est la différence entre ça :
Code C :
#include <stdio.h>
#include <unistd.h>

void fais_tout (void) {
        char *texte[] = {"hel", "lo ", "wor", "ld ", "!\n"};
        int toto;
        for (toto = 0; toto < 5; toto++) {
                sleep(1);
                printf ("%s", texte[toto]);
        }
}

int main (void) {
       
        fais_tout();
        return 0;
}

et ça :
Code C :
#include <stdio.h>
#include <unistd.h>

#define ACT_AFFICHEMSG  1
#define ACT_WAIT        2

void fais_un_truc (int action, int i) {
        char *texte[] = {"hel", "lo ", "wor", "ld ", "!\n"};
        switch(action) {
                case 1: { /* i est la partie du message a afficher */
                        printf ("%s", texte[i]);
                        break;
                }
                case 2: { /* i est le nombre de secondes a attendre */
                        Sleep(i);
                        break;
                }
                default: return;
        }
}

int main (void) {
        int toto;
        for (toto = 0; toto < 5; toto++) {
                fais_un_truc (ACT_WAIT, 1);
                fais_un_truc (ACT_AFFICHEMSG, toto);
        }
        return 0;
}

au delà du fait qu'on a une même fonction qui sert de dispatcher pour les différentes actions (switch/case) l'intérêt c'est surtout que dans le 2e code on garde la main sur la boucle toto, du coup on appelle la fonction en lui passant juste la partie du message à afficher, c'est un peu comme appeler une fonction film() en lui donnant comme paramètre l'image à afficher

Citation :De plus notre prof nous avais dis de regarder les threads pour ce projet.

c'est possible mais il ne devait pas parler de mettre plusieurs threads qui bossent en même temps sur la même ressource (la surface principale/l'écran), ce n'est ni la bonne façon de faire ni une bonne idée
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (3) -1 (0) Répondre
27-12-2013, 16h25
Message : #7
sakiir Hors ligne
[sakiir@Ubuntu]:~$ ./ExploitMe ShellC0de
*



Messages : 411
Sujets : 51
Points: 34
Inscription : Sep 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
Si c'est sous windows tu peux utiliser la fonction CreateThread()
Si non renseigne toi sur la "libpthread" qui peut être utilisé aussi bien sur windows ue sur un autre OS !
+1 (1) -1 (0) Répondre
27-12-2013, 23h21
Message : #8
InFamouZz Hors ligne
Membre actif
*



Messages : 76
Sujets : 21
Points: 3
Inscription : Dec 2011
RE: [C][SDL]Exécuter deux fonctions en même temps
merci pour les réponses.
@ gruik : je pense que si, tu ne peux pas boucler sur deux boucles en même temps surtout quand elle se déclenche a des moments différent et indéterminé. c obliger de faire du multitâche...
+1 (0) -1 (0) Répondre
28-12-2013, 00h56 (Modification du message : 28-12-2013, 03h09 par gruik.)
Message : #9
InFamouZz Hors ligne
Membre actif
*



Messages : 76
Sujets : 21
Points: 3
Inscription : Dec 2011
RE: [C][SDL]Exécuter deux fonctions en même temps
concrètement le problème est :
ndgruik: je me suis permis de réindenter le code et rajouter la balise [code]
Code C :
while (continuer!=0) {
        SDL_PollEvent(&event);
        switch(event.type) {
                case SDL_QUIT:
                        continuer = 0;
                        break;
                case SDLK_ESCAPE :
                        Continuer = 0;
                        break;
                case SDL_KEYDOWN :
                        switch(event.key.keysym.sym) {
                                case SDLK_RIGHT :
                                        droite();
                                        break;
                                case SDLK_LEFT :
                                        gauche();
                                        break;
                                default:
                                        break;
                        }
                        break;
        }

        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent > 30){
                descente();
        }
}

je voudrais pouvoir exécuter la fonction gauche ou droite sans attendre que descente est finie
+1 (1) -1 (0) Répondre
28-12-2013, 02h11
Message : #10
balis Hors ligne
Hack Compagnie by Eballys
*



Messages : 156
Sujets : 3
Points: 16
Inscription : Dec 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
Look la biblio pthread.h qui est fun. J'ai bossé dessus quelques temps et j'ai trouvé que c'était pratique.
Sur le net , les poules ont des dents. Bali .
Soit original soit celui qui sort de l'ordinaire soit toi . Bali .
C: ok bash : ok asm : en cours.
HTML/CSS : ok , PHP/MySQL : en cours.
+1 (0) -1 (0) Répondre
28-12-2013, 03h34
Message : #11
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
(28-12-2013, 00h56)InFamouZz a écrit : je voudrais pouvoir exécuter la fonction gauche ou droite sans attendre que descente est finie

j'avais bien compris, le but c'est de modifier ta boucle de cette façon (en gros, pas testé):
Code DIFF :
--- original    2013-12-28 02:20:29.991113200 +0100
+++ modified    2013-12-28 02:20:30.069113300 +0100
@@ -7,13 +7,15 @@
                case SDLK_ESCAPE :
                        Continuer = 0;
                        break;
+               case SDL_KEYUP:
+                       compteur_animation = 0;
                case SDL_KEYDOWN :
                        switch(event.key.keysym.sym) {
                                case SDLK_RIGHT :
-                                       droite();
+                                       droite(compteur_animation++);
                                        break;
                                case SDLK_LEFT :
-                                       gauche();
+                                       gauche(compteur_animation++);
                                        break;
                                default:
                                        break;


et forcément il faut répercuter la modification dans tes fonctions droite() et gauche() du coup, elles ne peuvent plus (ne doivent plus !) tout faire d'une traite dans une boucle mais au contraire s'adapter a la valeur de compteur_animation
“A computer is a state machine. Threads are for people who cant program state machines.” (Alan Cox)

après tu peux toujours t'entêter sur une approche par threads comme je vois que tout le monde y va de son lien bien senti mais je le répète ça revient à coder n'importe comment Sleepy
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (1) -1 (0) Répondre
28-12-2013, 04h39
Message : #12
b0fh Hors ligne
Membre actif
*



Messages : 210
Sujets : 17
Points: 309
Inscription : Jul 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
Je plussoie gruik, les pthreads ne sont absolument pas adaptés à la situation. Ce ne sont pas vraiment deux activités concurrentes puisqu'elle se partagent complètement un état (celui du jeu), tu as donc le choix entre tout protéger avec un gros mutex (et avoir des performances inutilement pires qu'avec un code sans threads) ou une protection bancale qui pourra altérer le gameplay (l'OS décide aléatoirement de bloquer le thread d'input sans bloquer les autres threads du jeu, c'est affreusement frustrant pour le joueur).

Une meilleure solution serait d'utiliser des coroutines mais C ne les supportant pas, il va falloir les faire à la main, en écrivant une seule boucle qui traitera les deux cas à chaque itération, en sauvegardant si nécessaire la situation actuelle dans des variables, au lieu de se baser sur le flot de contrôle pour exécuter des actions succesives.
+1 (1) -1 (0) Répondre
29-12-2013, 16h30 (Modification du message : 29-12-2013, 16h31 par sakiir.)
Message : #13
sakiir Hors ligne
[sakiir@Ubuntu]:~$ ./ExploitMe ShellC0de
*



Messages : 411
Sujets : 51
Points: 34
Inscription : Sep 2012
RE: [C][SDL]Exécuter deux fonctions en même temps
perso j'ai pas fais attention à la situation , mais vu le titre j'ai vu que ça comme solution :p
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut