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 :

Mettre un SDL_Thread sur pause ?


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut Mettre un SDL_Thread sur pause ?
    Bonjour !


    Toujours dans l'optique de mon projet, je voulais savoir s'il était possible de mettre un Thread sur pause pour qu'il ne consomme pas trop de ressources CPU ?

    En fait, ce que je vais gérer dans le programme (le futur jeu), c'est lorsque la fenêtre est réduite, le programme se met en pause (pas dans le jeu mais le programme lui même et se fixe sur SDL_WaitEvent).

    Vu que mon Thread de rendu sera une boucle continue, je voulais savoir s'il y avait moyen de le mettre également sur pause comme le programme, pour qu'il laisse les ressources aux programmes qui vont êtres utilisés en dehors du jeu mais sans toutefois sortir du Thread, ca il ne le faut pas !


    Merci pour tout
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Franck.H
    Toujours dans l'optique de mon projet, je voulais savoir s'il était possible de mettre un Thread sur pause pour qu'il ne consomme pas trop de ressources CPU ?
    En utilisant un mutex, oui.

    Dans ton code de rendu, tu pourrais tous les N itérations faire un lock sur un mutex qui te dit de continuer ou non.

    Si tu veux arrêter le rendu, fais un lock dessus. Le rendu s'arrêtera au maximum dans N frames.

    C'est à mon avis, la solution la plus propre.

    Jc

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je crois pas avoir tout saisie correctement

    Attention, je ne veux pas stopper le rendu definitivement, je veux qu'il reprenne là où il s'est arrêté une fois que le processus principale (le jeu) sorte de son mode pause donc quand la fenêtre est à nouveau restaurée ou que l'utilisateur lui redonne le focus.

    Le but serait que plus aucune boucle ne tourne tant que SDL_WaitEvent ne reçoit rien en événements.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Franck.H
    Je crois pas avoir tout saisie correctement

    Attention, je ne veux pas stopper le rendu definitivement, je veux qu'il reprenne là où il s'est arrêté une fois que le processus principale (le jeu) sorte de son mode pause donc quand la fenêtre est à nouveau restaurée ou que l'utilisateur lui redonne le focus.

    Le but serait que plus aucune boucle ne tourne tant que SDL_WaitEvent ne reçoit rien en événements.
    Suppose que ton code se repose sur ces fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(toutvabien) {
      GereEvenements();
      MisAJourObjets();
      Rendu();
    }
    Chaque fonction ressemblerait à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    void MisAJourObjets()
    {
    /* Lock the mutex */
    SDL_LockMutex(mutexmisajour);
     
    ....
     
    /* Unlock the mutex */
    SDL_UnlockMutex(mutexmisajour);
    }
     
    void Rendu()
    {
    /* Lock the mutex */
    SDL_mutexP(mutexrendu);
     
    ....
     
    /* Unlock the mutex */
    SDL_UnlockMutex(mutexrendu);
    }
     
     
    void GereEvenements()
    {
    ...
    /* Gestion des evenements */
    while(SDL_PollEvent(&event)) 
    {
      switch(event.type)
      {
        ...
        /* Mis a jour de la variable monetat...
            Je ne ferais pas ca, je gérerais dans ce switch mais c'est plus 
           facile pour comprendre....
        */
      }
      switch(monetat)
      {
       case JEUMISENPAUSE :
          /* On lock les mutex de rendu et de mis a jour */
          SDL_LockMutex(mutexrendu);
          SDL_LockMutex(mutexmisajour);
       break;
       case JEUREPREND:
          /* On relache les mutex de rendu et de mis a jour */
          SDL_UnlockMutex(mutexrendu);
          SDL_UnlockMutex(mutexmisajour);
       break;
       case LAFENETRESEMINIMISE :
          /* On lock les mutex de rendu et de mis a jour */
          SDL_LockMutex(mutexrendu);
       case LAFENETRESEDEMINIMISE :
          /* On relache les mutex de rendu et de mis a jour */
          SDL_UnlockMutex(mutexrendu);
       break
      }
    }
    Cela permettrait (en pseudo code et je ne le ferais pas exactement comme ca) de bloquer le code de rendu ou de mis a jour des objets si la fenêtre est en pause et de simplement bloquer le rendu si on minimise.

    J'espère que c'est clair, c'est aussi une simple idée à froid, il y a peut-être mieux mais je ne vois pas d'autre solution avec SDL...

    Jc

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ouais ok je vois à peu près ce que tu veux dire, donc en quelques sortes, le Thread ne sera jamais mis en pause, seulement le processus de rendu à l'écran c'est tout mais la boucle (celle du Thread) elle, tournera quand même mais à vide quoi.

    Bon si on peut pas faire mieux c'est pas grave Je vais tester tout ca, merci
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Franck.H
    Ouais ok je vois à peu près ce que tu veux dire, donc en quelques sortes, le Thread ne sera jamais mis en pause, seulement le processus de rendu à l'écran c'est tout mais la boucle (celle du Thread) elle, tournera quand même mais à vide quoi.

    Bon si on peut pas faire mieux c'est pas grave Je vais tester tout ca, merci
    Hmmm, le système d'exploitation se débrouille généralement pour endormir correctement un thread bloquer à un mutex et de le réveiller lorsque le mutex se libére.

    Il n'y a pas vraiment mieux comme facon de faire, la boucle qui gére le rendu et autre chose va se faire bloquer à une des étapes et donc s'endormir, en attendant que le mutex se libére.

    Jc

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

Discussions similaires

  1. Comment mettre un label sur une image
    Par dug dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 10h40
  2. mettre une JScrollBar sur un onglet
    Par thedd dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 02/03/2004, 20h12
  3. [VB6] mettre une image sur un boutton
    Par dim dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/02/2004, 01h28
  4. Réponses: 2
    Dernier message: 19/08/2003, 15h45
  5. Ne jamais mettre le focus sur un tbutton, possible
    Par portu dans le forum Composants VCL
    Réponses: 4
    Dernier message: 03/07/2003, 15h06

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