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 Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
[^] # Re: getline bloquant
Posté par Golgot04 . Évalué à 1.
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 daggett . Évalué à 1.
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 ecyrbe . Évalué à 2.
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.