GtkAda et multi tâches.

18 views
Skip to first unread message

DrPi

unread,
Mar 26, 2021, 5:39:12 AMMar 26
to
Bonjour,

Je fais des essais avec GtkAda. Mon but est d'afficher des données
reçues par une interface série ou par le réseau. Donc, multi-tâches
obligatoire.
Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait pas
vraiment. Je ne vois pas comment faire un affichage réactif avec des
callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
complexité accru. Mais je ne connais pas encore bien Ada et ses
librairies, je peux donc me tromper.

Dans mes recherches, je suis rapidement tombé sur une discution sur le
sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date cette
discution. 21 ans et 51 ans ne sont visiblement pas réalistes ;) et je
n'ai pas vu de conclusion.

Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
problème ?

Précision importante : le programme doit fonctionner sous Windows.

Cordialement,
Nicolas

(1)https://docs.adacore.com/gtkada-docs/gtkada_ug/_build/html/external_events.html
(2)https://gtkada.act-europe.narkive.com/cr8wpkFy/gtkada-and-tasking

Blady

unread,
Mar 27, 2021, 11:33:03 AMMar 27
to
Bonjour Nicolas,

Un exemple de programme multi-tâche avec GTKAda :
https://github.com/Blady-Com/tp7ada-gtkada/blob/master/examples/sudoku.adb

L'astuce : bien initialiser GTK au démarrage :
https://github.com/Blady-Com/tp7ada-gtkada/blob/master/src/tp7.adb#L827

Cordialement, Pascal.

DrPi

unread,
Mar 30, 2021, 3:36:05 PMMar 30
to
Le 27/03/2021 à 16:33, Blady a écrit :
> Le 26/03/2021 à 10:39, DrPi a écrit :
>> Bonjour,
>>
>> Je fais des essais avec GtkAda. Mon but est d'afficher des données
>> reçues par une interface série ou par le réseau. Donc, multi-tâches
>> obligatoire.
>> Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait pas
>> vraiment. Je ne vois pas comment faire un affichage réactif avec des
>> callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
>> complexité accru. Mais je ne connais pas encore bien Ada et ses
>> librairies, je peux donc me tromper.
>>
>> Dans mes recherches, je suis rapidement tombé sur une discution sur le
>> sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date cette
>> discution. 21 ans et 51 ans ne sont visiblement pas réalistes ;) et je
>> n'ai pas vu de conclusion.
>>
>> Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
>> problème ?
>>
>> Précision importante : le programme doit fonctionner sous Windows.
>>
>> Cordialement,
>> Nicolas
>>
>> (1)https://docs.adacore.com/gtkada-docs/gtkada_ug/_build/html/external_events.html
>>
>> (2)https://gtkada.act-europe.narkive.com/cr8wpkFy/gtkada-and-tasking
>
> Bonjour Nicolas,
Bonsoir Pascal,
>
> Un exemple de programme multi-tâche avec GTKAda :
> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/examples/sudoku.adb
>
> L'astuce : bien initialiser GTK au démarrage :
> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/src/tp7.adb#L827
>
Je regarde tout ça dès que j'ai un moment.

Merci.

Nicolas
> Cordialement, Pascal.

J-P. Rosen

unread,
Mar 31, 2021, 6:05:53 AMMar 31
to
Le 26/03/2021 à 10:39, DrPi a écrit :
> Je fais des essais avec GtkAda. Mon but est d'afficher des données
> reçues par une interface série ou par le réseau. Donc, multi-tâches
> obligatoire.
> Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait pas
> vraiment. Je ne vois pas comment faire un affichage réactif avec des
> callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
> complexité accru. Mais je ne connais pas encore bien Ada et ses
> librairies, je peux donc me tromper.
>
> Dans mes recherches, je suis rapidement tombé sur une discution sur le
> sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date cette
> discution. 21 ans et 51 ans ne sont visiblement pas réalistes ;) et je
> n'ai pas vu de conclusion.
>
> Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
> problème ?
>
OK, tu m'as obligé à me replonger dans ce code auquel je n'avais pas
touché depuis des lustres ;-)

J'ai un programme qui a une interface GTK, un serveur AWS, et une BDD
SQLite... Voilà comment ça marche.

Je commence par lancer/initialiser AWS et la base de données. Ensuite,
j'ai une seule tâche qui gère tout ce qui est GTK, et qui rentre dans la
main loop GTK.

Ca communique par un FIFO (protégé) de messages donnant à la tâche GTK
ce qu'elle doit afficher. L'astuce, c'est que quand je mets un message
dans le FIFO, j'appelle Glib.Main.Idle_Add avec la procédure qui va
aller repécher le message et agir en conséquence (et qui retourne False,
comme ça le Idle est débranché jusqu'au prochain message). => pas de
boucle active.

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr

DrPi

unread,
Mar 31, 2021, 1:16:10 PMMar 31
to
>
> Bonjour Nicolas,
>
> Un exemple de programme multi-tâche avec GTKAda :
> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/examples/sudoku.adb
>

J'ai essayé de compiler le programme... sans succès. Je suppose que le
code n'est pas compatible avec la version actuelle de GtkAda :
Le compilateur couine sur la ligne 46 de tp7.adb : "with Gtk.Main.Router;"
-> tp7.adb:46:06: file "gtk-main-router.ads" not found
Je l'ai commentée, juste pour voir. Le compilo couine ailleurs
(apparemment, pas lié au commentaire).
Je ne suis pas allé plus loin.

> L'astuce : bien initialiser GTK au démarrage :
> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/src/tp7.adb#L827
Oui, c'est bien précisé ici :
https://docs.adacore.com/gtkada-docs/gtkada_ug/_build/html/tasking.html

Mais il est aussi bien précisé que ça ne marche pas sous Windows. D'où
ma question ;)

Cordialement,
Nicolas

>
> Cordialement, Pascal.

DrPi

unread,
Mar 31, 2021, 1:31:32 PMMar 31
to
Le 31/03/2021 à 12:05, J-P. Rosen a écrit :
> Le 26/03/2021 à 10:39, DrPi a écrit :
>> Je fais des essais avec GtkAda. Mon but est d'afficher des données
>> reçues par une interface série ou par le réseau. Donc, multi-tâches
>> obligatoire.
>> Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait pas
>> vraiment. Je ne vois pas comment faire un affichage réactif avec des
>> callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
>> complexité accru. Mais je ne connais pas encore bien Ada et ses
>> librairies, je peux donc me tromper.
>>
>> Dans mes recherches, je suis rapidement tombé sur une discution sur le
>> sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date cette
>> discution. 21 ans et 51 ans ne sont visiblement pas réalistes ;) et je
>> n'ai pas vu de conclusion.
>>
>> Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
>> problème ?
>>
> OK, tu m'as obligé à me replonger dans ce code auquel je n'avais pas
> touché depuis des lustres ;-)
>
Ca fait quel effet ? ;)

> J'ai un programme qui a une interface GTK, un serveur AWS, et une BDD
> SQLite... Voilà comment ça marche.
>
> Je commence par lancer/initialiser AWS et la base de données. Ensuite,
> j'ai une seule tâche qui gère tout ce qui est GTK, et qui rentre dans la
> main loop GTK.
>
> Ca communique par un FIFO (protégé) de messages donnant à la tâche GTK
> ce qu'elle doit afficher. L'astuce, c'est que quand je mets un message
> dans le FIFO, j'appelle  Glib.Main.Idle_Add avec la procédure qui va
> aller repécher le message et agir en conséquence (et qui retourne False,
> comme ça le Idle est débranché jusqu'au prochain message). => pas de
> boucle active.
>

Intéressant. Je ne pensais pas que l'on pouvait appeler une quelconque
fonction de GtkAda en dehors du thread graphique.
Méthode intéressante. Good job :)

Il me vient tout de suite une question : Dans mon application, beaucoup
de messages/seconde peuvent être reçus par le réseau et transmis au
thread graphique. Faut-il une méthode de régulation pour ne pas
submerger GtkAda d'appels à Glib.Main.Idle_Add() ?
Je pose la question, mais ce n'est, à priori, pas bien compliqué à
implémenter. Donc, la question, c'est plus pour la forme.

Nicolas

J-P. Rosen

unread,
Mar 31, 2021, 3:11:03 PMMar 31
to
Le 31/03/2021 à 19:31, DrPi a écrit :
> Le 31/03/2021 à 12:05, J-P. Rosen a écrit :
>> Le 26/03/2021 à 10:39, DrPi a écrit :
>>> Je fais des essais avec GtkAda. Mon but est d'afficher des données
>>> reçues par une interface série ou par le réseau. Donc, multi-tâches
>>> obligatoire.
>>> Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait
>>> pas vraiment. Je ne vois pas comment faire un affichage réactif avec
>>> des callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
>>> complexité accru. Mais je ne connais pas encore bien Ada et ses
>>> librairies, je peux donc me tromper.
>>>
>>> Dans mes recherches, je suis rapidement tombé sur une discution sur
>>> le sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date
>>> cette discution. 21 ans et 51 ans ne sont visiblement pas réalistes
>>> ;) et je n'ai pas vu de conclusion.
>>>
>>> Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
>>> problème ?
>>>
>> OK, tu m'as obligé à me replonger dans ce code auquel je n'avais pas
>> touché depuis des lustres ;-)
>>
> Ca fait quel effet ? ;)

Ca fait plaisir de voir qu'on est encore capable de relire ce qu'on a
écrit quelques années auparavant...


>
>> J'ai un programme qui a une interface GTK, un serveur AWS, et une BDD
>> SQLite... Voilà comment ça marche.
>>
>> Je commence par lancer/initialiser AWS et la base de données.
>> Ensuite, j'ai une seule tâche qui gère tout ce qui est GTK, et qui
>> rentre dans la main loop GTK.
>>
>> Ca communique par un FIFO (protégé) de messages donnant à la tâche
>> GTK ce qu'elle doit afficher. L'astuce, c'est que quand je mets un
>> message dans le FIFO, j'appelle  Glib.Main.Idle_Add avec la procédure
>> qui va aller repécher le message et agir en conséquence (et qui
>> retourne False, comme ça le Idle est débranché jusqu'au prochain
>> message). => pas de boucle active.
>>
>
> Intéressant. Je ne pensais pas que l'on pouvait appeler une quelconque
> fonction de GtkAda en dehors du thread graphique.
> Méthode intéressante. Good job :)

Ce que j'ai compris, c'est que la tâche qui appelle Main_Loop est
bloquée en attente d'événement. Idle_Add va créer un événement, avec en
paramètre la procédure à appeler, mais ce sera bien la tâche GTK qui
effectuera l'appel.

>
> Il me vient tout de suite une question : Dans mon application,
> beaucoup de messages/seconde peuvent être reçus par le réseau et
> transmis au thread graphique. Faut-il une méthode de régulation pour
> ne pas submerger GtkAda d'appels à Glib.Main.Idle_Add() ?
> Je pose la question, mais ce n'est, à priori, pas bien compliqué à
> implémenter. Donc, la question, c'est plus pour la forme.
>
> Nicolas

Ben, ça créera juste une accumulation de messages dans la file d'attente
de la tâche GTK. Après, c'est juste une question de priorité entre les
tâches. Mais de toute façon, si le producteur produit plus vite que le
consommateur ne peut traiter, il y aura toujours un problème.

DrPi

unread,
Mar 31, 2021, 5:00:11 PMMar 31
to
Le 31/03/2021 à 21:11, J-P. Rosen a écrit :
> Le 31/03/2021 à 19:31, DrPi a écrit :
>> Le 31/03/2021 à 12:05, J-P. Rosen a écrit :
>>> Le 26/03/2021 à 10:39, DrPi a écrit :
>>>> Je fais des essais avec GtkAda. Mon but est d'afficher des données
>>>> reçues par une interface série ou par le réseau. Donc, multi-tâches
>>>> obligatoire.
>>>> Ce que l'on peut lire sur la page d'aide de GtkAda(1) ne me plait
>>>> pas vraiment. Je ne vois pas comment faire un affichage réactif avec
>>>> des callbacks 'idle' ou 'timeout'. A moins d'utiliser un niveau de
>>>> complexité accru. Mais je ne connais pas encore bien Ada et ses
>>>> librairies, je peux donc me tromper.
>>>>
>>>> Dans mes recherches, je suis rapidement tombé sur une discution sur
>>>> le sujet initiée pas Jean-Pierre(2). Je ne sais pas de quand date
>>>> cette discution. 21 ans et 51 ans ne sont visiblement pas réalistes
>>>> ;) et je n'ai pas vu de conclusion.
>>>>
>>>> Jean-Pierre (ou quelqu'un d'autre), y a t'il une bonne solution à ce
>>>> problème ?
>>>>
>>> OK, tu m'as obligé à me replonger dans ce code auquel je n'avais pas
>>> touché depuis des lustres ;-)
>>>
>> Ca fait quel effet ? ;)
>
> Ca fait plaisir de voir qu'on est encore capable de relire ce qu'on a
> écrit quelques années auparavant...

:)

>
>
>>
>>> J'ai un programme qui a une interface GTK, un serveur AWS, et une BDD
>>> SQLite... Voilà comment ça marche.
>>>
>>> Je commence par lancer/initialiser AWS et la base de données.
>>> Ensuite, j'ai une seule tâche qui gère tout ce qui est GTK, et qui
>>> rentre dans la main loop GTK.
>>>
>>> Ca communique par un FIFO (protégé) de messages donnant à la tâche
>>> GTK ce qu'elle doit afficher. L'astuce, c'est que quand je mets un
>>> message dans le FIFO, j'appelle  Glib.Main.Idle_Add avec la procédure
>>> qui va aller repécher le message et agir en conséquence (et qui
>>> retourne False, comme ça le Idle est débranché jusqu'au prochain
>>> message). => pas de boucle active.
>>>
>>
>> Intéressant. Je ne pensais pas que l'on pouvait appeler une quelconque
>> fonction de GtkAda en dehors du thread graphique.
>> Méthode intéressante. Good job :)
>
> Ce que j'ai compris, c'est que la tâche qui appelle Main_Loop est
> bloquée en attente d'événement. Idle_Add va créer un événement, avec en
> paramètre la procédure à appeler, mais ce sera bien la tâche GTK qui
> effectuera l'appel.
>

C'est ce que j'ai compris aussi en lisant la doc.

>>
>> Il me vient tout de suite une question : Dans mon application,
>> beaucoup de messages/seconde peuvent être reçus par le réseau et
>> transmis au thread graphique. Faut-il une méthode de régulation pour
>> ne pas submerger GtkAda d'appels à Glib.Main.Idle_Add() ?
>> Je pose la question, mais ce n'est, à priori, pas bien compliqué à
>> implémenter. Donc, la question, c'est plus pour la forme.
>>
>> Nicolas
>
> Ben, ça créera juste une accumulation de messages dans la file d'attente
> de la tâche GTK. Après, c'est juste une question de priorité entre les
> tâches. Mais de toute façon, si le producteur produit plus vite que le
> consommateur ne peut traiter, il y aura toujours un problème.
>
Tout à fait.
Pour être plus précis, il y a des salves de messages par moments. Une
grosse salve au démarrage et d'autres plus petites par la suite. Dans la
globalité, le débit est faible. Ce sont les salves qui m'inquiètent s'il
y a une limite sur la file d'attente.
Je ferai des tests et j'adapterai en conséquence.

Merci encore.

Nicolas

Blady

unread,
Jul 3, 2021, 11:01:31 AMJul 3
to
Le 31/03/2021 à 19:16, DrPi a écrit :
>>
>> Bonjour Nicolas,
>>
>> Un exemple de programme multi-tâche avec GTKAda :
>> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/examples/sudoku.adb
>>
> J'ai essayé de compiler le programme... sans succès. Je suppose que le
> code n'est pas compatible avec la version actuelle de GtkAda :
> Le compilateur couine sur la ligne 46 de tp7.adb : "with Gtk.Main.Router;"
> -> tp7.adb:46:06: file "gtk-main-router.ads" not found
> Je l'ai commentée, juste pour voir. Le compilo couine ailleurs
> (apparemment, pas lié au commentaire).
> Je ne suis pas allé plus loin.

Je reprends le fil, j'attendais la sortie de GTKAda CE 2021 pour
vérifier les compatibilités de ce code que je n'ai effectivement pas
revu depuis un moment.
J'ai maintenant installé GTKAda CE 2021.

Pour info, je l'ai mis disponible pour macOS 11 sur SF:
https://sourceforge.net/projects/gnuada/files/GNAT_GPL%20Mac%20OS%20X/2021-big-sur

Et surprise il est bien encore fonctionnel :-)
Mais j'oubliais qu'il utilise aussi les compléments de Dmitry Kazakov:
http://www.dmitry-kazakov.de/ada/aicwl.htm
Avec notamment le paquetage manquant : gtk-main-router.ads
Il y a plein d'autres choses utiles.

>> L'astuce : bien initialiser GTK au démarrage :
>> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/src/tp7.adb#L827
> Oui, c'est bien précisé ici :
> https://docs.adacore.com/gtkada-docs/gtkada_ug/_build/html/tasking.html
>
> Mais il est aussi bien précisé que ça ne marche pas sous Windows. D'où
> ma question ;)

As-tu poursuivi avec la version CE 2021 ?

Cordialement, Pascal.

DrPi

unread,
Jul 11, 2021, 4:16:37 PMJul 11
to
Je viens de me rendre compte que je n'ai pas répondu au groupe mais
directement à Pascal. Je renvoie donc ma réponse ici.


Bonsoir Pascal,

Le 03/07/2021 à 17:01, Blady a écrit :
> Le 31/03/2021 à 19:16, DrPi a écrit :
>>>
>>> Bonjour Nicolas,
>>>
>>> Un exemple de programme multi-tâche avec GTKAda :
>>>
https://github.com/Blady-Com/tp7ada-gtkada/blob/master/examples/sudoku.adb
>> J'ai essayé de compiler le programme... sans succès. Je suppose que
le code n'est pas compatible avec la version actuelle de GtkAda :
>> Le compilateur couine sur la ligne 46 de tp7.adb : "with
Gtk.Main.Router;"
>> -> tp7.adb:46:06: file "gtk-main-router.ads" not found
>> Je l'ai commentée, juste pour voir. Le compilo couine ailleurs
(apparemment, pas lié au commentaire).
>> Je ne suis pas allé plus loin.
>
> Je reprends le fil, j'attendais la sortie de GTKAda CE 2021 pour
vérifier les compatibilités de ce code que je n'ai effectivement pas
revu depuis un moment.
> J'ai maintenant installé GTKAda CE 2021.
>
> Pour info, je l'ai mis disponible pour macOS 11 sur SF:
>
https://sourceforge.net/projects/gnuada/files/GNAT_GPL%20Mac%20OS%20X/2021-big-sur
>
> Et surprise il est bien encore fonctionnel
> Mais j'oubliais qu'il utilise aussi les compléments de Dmitry Kazakov:
> http://www.dmitry-kazakov.de/ada/aicwl.htm
> Avec notamment le paquetage manquant : gtk-main-router.ads
> Il y a plein d'autres choses utiles.
>
>>> L'astuce : bien initialiser GTK au démarrage :
>>> https://github.com/Blady-Com/tp7ada-gtkada/blob/master/src/tp7.adb#L827
>> Oui, c'est bien précisé ici :
https://docs.adacore.com/gtkada-docs/gtkada_ug/_build/html/tasking.html
>>
>> Mais il est aussi bien précisé que ça ne marche pas sous Windows.
D'où ma question
>
> As-tu poursuivi avec la version CE 2021 ?
Je n'ai pas encore installé les versions 2021 des packages d'Adacore
(Windows, ARM et Gtk).

Je suis un peu réticent car lors de la migration du package ARM 2019 à
2020, j'ai eu pas mal de boulot pour retomber sur mes pattes (je crée
mes propres runtime pour des cartes non supportées de base).
J'ai peur que ce soit encore le cas en passant à la version 2021.
Installer 2 versions (2019 et 2020) a été problématique (je n'ai pas
cherché pourquoi).

Bonne soirée,
Nicolas
>
> Cordialement, Pascal.

Reply all
Reply to author
Forward
0 new messages