Bonjour,
Existe t'il une méthode pour stopper un programme lors de l'affichage d'une boite de dialogue avec un message d'erreur par exemple ?
Ensuite en fermant cette boite de dialogue le programme continue...
Merci beaucoup pour votre aide :)
Version imprimable
Bonjour,
Existe t'il une méthode pour stopper un programme lors de l'affichage d'une boite de dialogue avec un message d'erreur par exemple ?
Ensuite en fermant cette boite de dialogue le programme continue...
Merci beaucoup pour votre aide :)
Ca dépend. (j'aime bien ce genre de réponse :mouarf:. )
Plus sérieusement tu peux rendre ta fenêtre de dialogue modale. C'est à dire qu'elle vient par dessus toutes les autres et tant qu'elle n'est pas fermée il est impossible d'accéder aux autres fenêtres de la même application.
Quand j'écris que ca dépend c'est pour mettre un bémol sur les mots "stopper un programme". Si par exemple ton application a lancé des threads, ils continueront de tourner lors de l'affichage de la fenêtre de dialogue.
Et c'est justement ce dernier point que je souhaiterais aborder.
Exemple tout con, pour tester les choses j'ai fais une boucle toute bête i++ pendant laquelle s'ouvre la boite de dialogue.
Bien j'aimerais que la boucle stoppe lors de l'affichage de la boite de dialogue.
Le fait que les autres fenêtres soient inutilisables est très intéressant aussi, je vais m'en servir. Mais le top c'est de dire au programme en C qui calcule derrière "toi tu t'arrêtes fissa et tu reprends quand je te le dis" :)
J'avais pensé à coupler lors de l'affichage de la fenêtre un petit getchar(); ....
Le problème est que ton programme tourne dans une boucle Gtk principale. Toutes les fenêtres secondaires ouvertes font parties de la même boucle.
A priori je déclarerai un drapeau qui mis à FALSE laisserai tourner les boucles internes et à TRUE les arrêterai. Ca veut dire aussi que les boucles doivent intégrer le test de l'état du drapeau. C'est peut être un peu lourd.
Autre manière de faire serait d'utiliser les threads avec les mutex. Mais il faut bien penser son code avant de se lancer là dedans.
Peut être une autre solution. Lancer une deuxieme boucle gtk_main(); indépendante de l'interface principale dans laquelle est exécutée la fenêtre de dialogue.
Pendant ce temps on peut bloquer la première boucle gtk avec la fonction gboolean gtk_main_iteration_do (gboolean blocking);.
A tester...
Bon merci beaucoup pour ton aide. Je vois que le problème est bien plus épineux que prévu :)
La partie code en C est vraiment trop imposante pour que je puisse me permettre de le modifier trop profondément. Je cherchais une solution simple qui me permette de le stopper, mais si c'est impossible sans grosses manips, tant pis :)
Merci beaucoup encore Gerald ;)
C'est faisable comme gérald te l'a dit dès le début, en utilisant une boite de dialogue modale.
Voir la documentation de GtkDialog.Citation:
A 'modal' dialog (that is, one which freezes the rest of the application from user input), can be created by calling gtk_window_set_modal() on the dialog. Use the GTK_WINDOW() macro to cast the widget returned from gtk_dialog_new() into a GtkWindow. When using gtk_dialog_new_with_buttons() you can also pass the GTK_DIALOG_MODAL flag to make a dialog modal.