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 :

[C++]Timer pour exécution séparée


Sujet :

SDL

  1. #1
    Invité4
    Invité(e)
    Par défaut [C++]Timer pour exécution séparée
    Bonjour,

    je suis en train de développer un jeu en SDL,
    toutes les 12 secondes, il se resynchronise avec le serveur de jeu, ce qui provoque un freeze de 2 secondes.
    J'ai entendu parler des timer avec SDL.
    Il me semble que ces timers font ce que je souhaite : une exécution périodique et séparée du reste de l'exécution (donc plus de coupures).
    J'ai retenu la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int SDL_SetTimer(Uint32 interval, SDL_TimerCallback callback);
    (http://www.megastep.org/SDL/progsdl5.html)

    Seulement, la doc SDL est assez mal faite je trouve, car je ne comprends pas ce que le paramètre TimerCallback callback représente.
    Si j'ai compris, il s'agit de la fonction qui sera exécutée en différé et périodiquement.

    Donc j'ai ma fonction void ServerRefresh(void), j'ai beau la passer tel quel ou encore &ServerResfresh ou "ServerRefresh", rien ne fonctionne.

    Savez-vous comment faire ?

    Merci

  2. #2
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Personnellement je n'utilise pas SDL_SetTimer(...) mais plutot SDL_GetTicks() qui recupere le temps courant.

    Si tu le souhaites, j'ai une classe timer entierement faites avec l'utilisation de SDL_GetTicks(), je peux la mettre à ta disposition (elle doit faire l'objet de mon prochain tuto donc...).

    Sinon pour la signification des arguments, tu peux toujours aller voir sur ce man (si ce n'est pas déjà fais):
    http://techpubs.sgi.com/library/tpl/...SDL_SetTimer.Z

    The callback function is passed the current timer interval and returns the next timer inter-val.

  3. #3
    Invité4
    Invité(e)
    Par défaut
    Merci de ta réponse
    En fait, getTicks c'est des timestamp pour gérer le temps.
    Ce que je cherche en fait c'est une exécution différée (faire deux choses en m^eme temps, il me semblait que SetTimer me le permet, mais je rame avec ce callback).
    En fait, cette page d'aide est très bien fait, mais elle ne dit pas comment on donne un callback (c'est bien une fonction à passer en paramètre ?)

  4. #4
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    dans ce cas, pourquoi ne fais-tu pas du multi-threading en lancant ton timer dans un threads different du principal????

    si tu es en C++ comme cela a l'air dans ton titre, vas voir ca deja et , .

    voila, salut
    développeur en folie cherche à ... développer encore plus

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    rien ne fonctionne
    C'est-à-dire ?

    Vu la tête de ta fonction callback, j'imagine que c'est une erreur de compilation. Comme la doc l'indique très bien, la fonction passée en paramètre doit prendre un Uint32 en paramètre et renvoyer un Uint32.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Uint32 ServerRefresh(Uint32 Param)

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    dans ce cas, pourquoi ne fais-tu pas du multi-threading en lancant ton timer dans un threads different du principal????
    A priori la fonction SDL_SetTimer le fait déjà, donc ce serait inutile et plus compliqué.

  7. #7
    Invité4
    Invité(e)
    Par défaut
    Citation Envoyé par doudouallemand
    dans ce cas, pourquoi ne fais-tu pas du multi-threading en lancant ton timer dans un threads different du principal????

    si tu es en C++ comme cela a l'air dans ton titre, vas voir ca deja et , .

    voila, salut
    Pour le multithreading, je l'a déjà dit et je me répète : il me semble que les timers SDL reposent là-dessus, et vu que mon exécutable est compilé sous windows et linux, je préfère ne m'appuyer que sur SDL, pour rester compatible.
    Donc ta classe TThread qui y va à coups de ShellExecute, merci


    Citation Envoyé par Laurent Gomila
    C'est-à-dire ?

    Vu la tête de ta fonction callback, j'imagine que c'est une erreur de compilation. Comme la doc l'indique très bien, la fonction passée en paramètre doit prendre un Uint32 en paramètre et renvoyer un Uint32.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Uint32 ServerRefresh(Uint32 Param)
    Ok, tu aurais un exemple, car je ne saisis pas la logique il me semble, comment passer d'une fonction en un uint32 ?
    Si je comprends la logique : tu donnes au timer une fonction qui sera exécutée toutes les x [ms] dans un thread séparé ?

    Merci de ta réponse

  8. #8
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Laurent Gomila
    A priori la fonction SDL_SetTimer le fait déjà, donc ce serait inutile et plus compliqué.
    oui, je suis d'accord amsi, bon, c'est aussi un solution pour s'en sortir, au cas ou...

    [EDIT]ok, d'accord...[/EDIT]
    développeur en folie cherche à ... développer encore plus

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ok, tu aurais un exemple, car je ne saisis pas la logique il me semble, comment passer d'une fonction en un uint32 ?
    Où veux-tu passer d'une fonction à un Uint32 ? Tout ce qu'il faut faire ici c'est définir une fonction avec le bon prototype, et la passer en paramètre à SDL_SetTimer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetTimer(12000, &ServerRefresh);
    Si je comprends la logique : tu donnes au timer une fonction qui sera exécutée toutes les x [ms] dans un thread séparé ?
    Exactement.

  10. #10
    Invité4
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void RefreshServer(void)
    {
         std::cout << "ceci est un test des timers" << std::endl;
    }
    SDL_SetTimer(12000, &ServerRefresh);
    game_engine.cpp:204: erreur: invalid conversion from ‘void (*)()’ to ‘Uint32 (*)(Uint32)’
    Voilà ou je bute, je donne l'adresse de ma fonction et lui il refuse
    Ou j'ai peut-etre raté une case dans mon livre C++.
    Si tu as le temps, ce qui m'aiderait serait un exemple simple avec une fonction et un timer l'utilisant, pour que je voie vraiment quel est le problème.

    Merci encore

  11. #11
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Eldacar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void RefreshServer(void)
    {
         std::cout << "ceci est un test des timers" << std::endl;
    }
    SDL_SetTimer(12000, &ServerRefresh);
    Voilà ou je bute, je donne l'adresse de ma fonction et lui il refuse
    Ou j'ai peut-etre raté une case dans mon livre C++.
    Si tu as le temps, ce qui m'aiderait serait un exemple simple avec une fonction et un timer l'utilisant, pour que je voie vraiment quel est le problème.

    Merci encore
    attention, le nom de fonction que tu donnes est different de celui de la declaration!!!

    fais plutot je pense :
    [quote=Eldacar]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void RefreshServer(void)
    {
         std::cout << "ceci est un test des timers" << std::endl;
    }
    SDL_SetTimer(12000, &RefreshServer);
    développeur en folie cherche à ... développer encore plus

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Laurent Gomila
    Vu la tête de ta fonction callback, j'imagine que c'est une erreur de compilation. Comme la doc l'indique très bien, la fonction passée en paramètre doit prendre un Uint32 en paramètre et renvoyer un Uint32.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Uint32 ServerRefresh(Uint32 Param)

  13. #13
    Invité4
    Invité(e)
    Par défaut
    Merci de ta suggestion, mais dans mon code j'avais corrigé et le problème est clair

    game_engine.cpp:204: erreur: invalid conversion from ‘void (*)()’ to ‘Uint32 (*)(Uint32)’

  14. #14
    Invité4
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Uint32 RefreshServer(Uint32 param)
    {
         std::cout << "ceci est un test des timers" << std::endl;
    }
    SDL_SetTimer(12000, &RefreshServer);
    game_engine.cpp:201: erreur: invalid conversion from ‘Uint32 (*)(Uint32)’ to ‘Uint32 (*)(Uint32, void*)’
    je suis au bord du suicide

    je crois vraiment que j'ai loupé un épisode,
    tu n'aurais pas un exemple ?

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    D'où sort ce void* ? Là je sèche...

  16. #16
    Invité4
    Invité(e)
    Par défaut
    Citation Envoyé par Laurent Gomila
    D'où sort ce void* ? Là je sèche...
    Moi aussi, cet idiot de gcc 4 semble peiner.
    Ce qui est dommage est que je ne trouve pas de codes d'exemples sur le net utilisant cette fonction.

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Test ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <iostream>
     
    #include <SDL.h>
     
    Uint32 RefreshServer(Uint32 param)
    {
                 std::cout << "ceci est un test des timers" << std::endl;
    }
    int main()
    {
    SDL_SetTimer(12000, &RefreshServer);
    return 0;
    }
    Compilation:
    g++ timer.c `sdl-config --libs --cflags`
    ~tmp$ g++ -v
    gcc version 4.0.3 20060115 (prerelease) (Debian 4.0.2-7)
    Et recompile tout ton programme, vérifie qu'il trouve bien la bonne fonction...

    Jc

  18. #18
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Uint32 RefreshServer(Uint32 param)
    {
                 std::cout << "ceci est un test des timers" << std::endl;
    }
    Ta fonction ne renvoie rien (elle fait juste un affichage), donc même si elle est déclaré renvoyant un Uint32, elle passe en void* d'où le problème...

    Par exemple, dans l'exemple du lien que tu as donné au debut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static Uint32 ticktock(Uint32 interval)
    {
    	++ticks;
    	return(interval);
    }
    donc il te manque par exemple :


  19. #19
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par loka
    Ta fonction ne renvoie rien (elle fait juste un affichage), donc même si elle est déclaré renvoyant un Uint32, elle passe en void* d'où le problème...
    Euhhhh... Depuis quand? Parce qu'en C ou en C++, ce n'est pas vrai. Je t'accorde que le compilateur devrait dire quelque chose (j'ai copié la même **** ) mais cela ne veut pas dire qu'il va changer le prototype...

    Ou alors j'apprends quelque chose de vraiment nouveau ce soir
    Jc

  20. #20
    Invité4
    Invité(e)
    Par défaut
    Merci à vous deux pour vos réponses,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static Uint32 ticktock(Uint32 interval)
    {
        int ticks = 0;
        ++ticks;
        return(ticks);
    }
     
    // appelé dans une fonction
    SDL_AddTimer(44, &ticktock);
    me donne toujours
    game_engine.cpp:193: erreur: invalid conversion from ‘Uint32 (*)(Uint32)’ to ‘Uint32 (*)(Uint32, void*)’
    Donc le return ne change pas, peut-etre dois-je passer un paramètre à ticktock, mais comment ?

    Peut-etre ce problème est lié à ma version de gcc (codeblocks) ?
    Je me demande si l'un d'entre vous arrive à compiler ce timer.
    Dernière modification par Domi2 ; 23/08/2011 à 14h59.

Discussions similaires

  1. [VBA-EXcel] Timer pour mise jour automatique
    Par Dos dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/09/2006, 21h36
  2. [VB.Net] Timer pour fermer et ouvrir une form
    Par badnane2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 09/08/2006, 14h09
  3. [VB.NET] Label - Un timer pour tous ?
    Par b_lob dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/05/2006, 16h56
  4. creer une page avec timer pour 2 URLS
    Par anubisme dans le forum Langage
    Réponses: 4
    Dernier message: 21/04/2006, 12h03
  5. Réponses: 4
    Dernier message: 24/11/2005, 09h34

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