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 daggett . En réponse au message Kdevelop freeze. É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"...