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 Timers [SDL 1.2]


Sujet :

SDL

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Utilisation des Timers
    Bonjour,

    J’utilise les Timers de la SDL 1.2 et je me pose une question à ce sujet :
    L’exécution de la fonction de CallBack du Timer est-elle réalisée dans un autre thread parallèle ou est-ce le thread principal qui est interrompu lors de l’exécution du CallBack ?
    Je me pose cette question pour le risque d’accès concurrents en mémoire, comment peut-on se protéger si il s’agit de 2 threads parallèles ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    oui comme la doc l'indique, la callback est appelée sur son propre thread.
    Cette même doc présente un exemple pour transférer la callback au thread principal, en passant par un évènement.

    Sinon tu peux directement utiliser SDL_GetTicks pour gérer ton propre timer.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Merci pour la réponse.
    Dans la doc SDL 1.2 je n’avais pas vu cet article mais j’ai peut-être mal cherché.
    J’utilise actuellement un UserEvent comme interruption en restant dans le même thread mais c’est un peu moins souple : il faut passer en boucle pour tirer les évènements alors qu’une routine de CallBack est appelée immédiatement.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par nanosoft Voir le message
    je n’avais pas vu cet article mais j’ai peut-être mal cherché
    C'est le premier résultat google pour "SDL timer" et aussi le premier résultat pour "timer" sur la doc en elle-même. (Je suppose qu'en connaissant le nom de la fonction les résultats sont encore plus simples à retrouver, mais je ne le connaissais alors pas)
    Citation Envoyé par nanosoft Voir le message
    il faut passer en boucle pour tirer les évènements
    Tu dois de toutes façons tirer tous les évènements en file d'attente à chaque frame. En quoi ajouter un évènement serait un problème ?
    Citation Envoyé par nanosoft Voir le message
    une routine de CallBack est appelée immédiatement.
    Mais si ta callback doit utiliser des données qu'un autre thread utilise aussi, tu vas devoir mettre des locks ou transférer son exécution au thread principal. Donc l'aspect immédiat... ne l'est pas tant au final.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Salut,

    L’utilisation envisagée était de réaliser un « timeout » en monothread lorsque l’exécution d’une tache un peu longue est en cours et pendant ce temps là on ne peut pas tirer les évènements.

    Mais tu as raison de me renvoyer à la doc, je n’avais regardé que la 1.2 et en regardant à nouveau effectivement j’ai vu ceci :
    « The timer callback function may run in a different thread than your main constant, and so shouldn't call any functions from within itself. »

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    S'agit-il d'un projet de jeu ? Si oui, tu ne devrais pas avoir de tâche "trop longue" au point de bloquer le thread principal aussi longtemps.
    Les tâches longues (type chargement de fichier) devraient être faîtes sur un thread différent. Généralement on a un système de jobs pour ça, le main thread pousse un job et récupère un handle, le job thread l'exécute, puis le main thread peut vérifier l'état du job via le handle.
    Si le thread principal bloque trop longtemps, ta fenêtre va passer en "pas de réponse" et le système va la considérer comme bloquée/morte. Aussi sur certaines plateformes tu as des appels à exécuter à chaque frame pour s'assurer que le jeu n'est pas bloqué également. Et chaque frame ne peut durer plus de X secondes (généralement 5 de mémoire). Ceci pour permettre aux plus petites productions de ne pas s'embêter avec un thread de chargement de fichiers, tant qu'ils sont peu nombreux et rapides à traiter.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Oui c’est un projet de jeu.
    Je suis bien conscient de toutes tes recommandations, au final je vais m’orienter comme tu le proposes mais au début je me demandais si je ne pourrais pas simplifier avec une réalisation monothread.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Si tu veux faire simple, gardes ton système actuel et aies des chargements bloquants et opérations longues bloquantes sur le main thread.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Utilisation des timer
    Par totot dans le forum Général Java
    Réponses: 3
    Dernier message: 13/06/2017, 10h43
  2. Réponses: 1
    Dernier message: 08/08/2016, 09h49
  3. [Turbo Pascal] Unité Timer : Utilisation des fonctionnalités du timer du BIOS
    Par Eric Sigoillot dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 07/04/2014, 20h31
  4. Utilisation des Timer
    Par Patrice.H dans le forum C#
    Réponses: 3
    Dernier message: 06/05/2011, 09h18
  5. utilisation des timers
    Par iwio dans le forum Allegro
    Réponses: 1
    Dernier message: 25/06/2006, 23h55

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