Forum Programmation.c Kdevelop freeze

Posté par  .
Étiquettes : aucune
0
12
juin
2007
Bonjour, Je suis vraiment débutant en C et tout le tralala, et évidemment, je programme (mal) dans l'urgence... :)
Concrètement j'ai un programme lambda sous linux (dans lequel je ne peux pas intervenir facilement) qui ecrit des messages dans la console (genre
debit = 125 Mbits/s
debit = 122 Mbits/s
debit = 121 Mbits/s
debit = 122 Mbits/s
toutes les 3 secondes environ...

J'essaye de faire une interface graphique qui m'affiche une courbe avec ces valeurs.
J'ai donc décidé de programmer en c avec kdevelop et d'utiliser mon interface graphique de la façon suivante
lambda|mon_gui

et dans mon_gui je fais un
while(TRUE)
{
cin.getline(str)
traite_et_affiche(str)
}
seulement, le getline marche mais me freeze l'application... autrement dit, si je ne fais pas de boucle infinie mais une seule itération, j'ai bien la première valeur qui s'affiche... mais avec la boucle, tout le programme est bloqué...

Comment puis-je forcer le refresh de mon interface graphique?
  • # getline bloquant

    Posté par  (site web personnel) . Évalué à 2.

    Cela peut être plusieurs choses : getline() bloquant, cin qui considère arriver à EOF alors que tu continues d'écrire (il faut reseter ce flag ? man feof() ).

    "La première sécurité est la liberté"

    • [^] # Re: getline bloquant

      Posté par  . Évalué à 1.

      J'ai essayé en mettant un bouton poussoir,

      void bouton_clicked()
      {
      cin.getline(str,100)
      affiche(str2)
      }

      et là, à chaque fois que je clique sur le bouton, il m'affiche une nouvelle ligne...

      Donc getline fonctionne bien mais bloque le rafraichissement de la fenêtre... Comment faire pour lui laisser du répit, j'ai essayé sleep(1)... mais ça ne fonctionne pas!
      • [^] # Re: getline bloquant

        Posté par  . Évalué à 1.

        Il faut bien te rendre compte que ton programme, à lui tout seul, est parfaitement linéaire et mono-tâche: Si tu lui demandes de lire la prochaine ligne de l'entrée standard, il bloquera effectivement jusqu'à ce qu'une ligne arrive. Tout ce qui concerne la gestion de l'interface graphique est dans d'autres routines qui ne pourront être appelées que quand getline rendra la main.

        Pour pouvoir faire plusieurs choses à la fois, tu as en gros le choix entre deux choses:
        - Rendre ton programme multitheadé, chaque thread étant un process indépendant qui fait son truc (c'est alors Linux qui les fera s'exécuter en parallèle). Il faudra malgrès tout pouvoir les faire communiquer pour justement transmettre ce getline()... Et le multithread c'est pas forcément le plus facile quand on débute :)
        - Utiliser une boucle d'événement.
        Ce dernier point est le classique de tout programme devant gérer plusieurs choses à la fois, et de tout truc ayant une interface graphique. L'idée est d'avoir une boucle while(1) centrale qui attend un "événement" quelconque pouvant arriver de plusieurs sources différentes; une fois celui-ci identifié, on appelle alors la routine qui traitera les données en attente pour cet événement.

        Je ne sais pas quel toolkit graphique tu utilises, mais il te donne forcément des points d'entrée pour sa boucle d'événement. Tu devrais avoir le moyen de donner par exemple un couple (descripteur de fichier + fonction), pour que la boucle d'évenement appelle ta fonction dès qu'il y a des données à lire sur ce descripteur (dans ton cas, l'entrée standard), sans avoir à bloquer dessus.

        Sinon au pire tu peux le faire gruik toi-même, en testant continuellement dans ta boucle while:
        if "quelque chose à lire" cin.getline(); else rendre_la_main_au_GUI();
        (mais sache que ton prog prendra alors 100% de CPU).
        Je ne connais rien en C++, donc je ne sais pas comment on fait la partie "if quelque chose à lire"...
        • [^] # Re: getline bloquant

          Posté par  . Évalué à 2.

          En c++ les appels standards sont bloquants...
          si tu veux savoir s'il y a quelque chose à lire, t'es obligé de passer par le "C" avec une fonction comme "select()"... en lui donnant ton descripteur de fichier. Or le descripteur se récupère très facilement, c'est "stdin"...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.