Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GtkAda et multi tâches.

30 views
Skip to first unread message

DrPi

unread,
Mar 26, 2021, 5:39:12 AM3/26/21
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 AM3/27/21
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 PM3/30/21
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 AM3/31/21
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 PM3/31/21
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 PM3/31/21
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 PM3/31/21
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 PM3/31/21
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 AM7/3/21
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 PM7/11/21
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.

Thomas

unread,
Jan 19, 2022, 10:09:12 PM1/19/22
to
In article <60eb51a3$0$32527$426a...@news.free.fr>, DrPi <3...@drpi.fr>
wrote:

> Le 03/07/2021 à 17:01, Blady a écrit :

> > 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.



> > 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


as-tu résolu ton pb depuis, ou pas ?


dans ton dernier msg, si je t'ai bien lu, tu ne t'occupais que de GNAT
CE 2021.

à ma connaissance, ce qui compte pour résoudre ton pb, c'est les
compléments de Dmitry Kazakov

si tu ne trouves pas de paquet de binaires tout prêts, qui soient
parfaitement adaptés à ta configuration, en général c'est pas très dur
de compiler des bibliothèques additionnelles soi-même.
la condition importante étant qu'elles n'aient pas été conçues pour des
outils plus récents que ceux dont tu disposes
(sinon le temps nécessaire à la revue de code est indéterminé -
mais si tu n'est pas très exigeant il suffit souvent de remonter dans
les versions autant que nécessaire par rapport aux versions des outils).

en plus celui là a l'air assez léger, surtout que (je peux me tromper)
il me semble bien que Gtk.Main.Router est indépendant des autres qui
sont fournis en même temps,
donc si ce sont uniquement d'autres qui posent pb, il doit bien être
possible d'adapter la config pour ne compiler que celui-là !


si je me trompe, et que tu n'y arrives tjr pas, tiens nous au courant :-)

--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/

Thomas

unread,
Jan 20, 2022, 2:06:29 AM1/20/22
to
In article <6064e2da$0$3711$426a...@news.free.fr>, DrPi <3...@drpi.fr>
wrote:

> 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'.

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


> >>> 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.

si Dmitry Kazakov ne lit pas ce fil, je suggère que des que qqn en aura
l'occasion, il lui fasse la suggestion d'intégrer l'astuce de
Jean-Pierre.

j'ai vérifié sa dernière version, si je ne me trompe pas il en est resté
à un Idle avec une boucle active répétée toutes les 0,2 secondes (par
défaut - on peut choisir le délai).

si je ne me trompe pas, l'astuce de Jean-Pierre permet,
en plus d'économiser du traitement processeur quand il ne se passe rien,
d'être plus réactif quand il y a un traitement à faire, en le traitant
immédiatement plutôt que d'attendre au max 0,2 s donc en moyenne 0,1 s
pour le faire.

c'est probablement qqch qui lui a simplement échappé :
je n'ai pas lu la doc aussi soigneusement que Nicolas,
et avant de lire ce fil, je croyais que tout ce qui venait avec le
paquet GtkAda devait impérativement être appelé par la même tache.



>
> >>
> >> 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.

> >
> > 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.

en fait, les taches ça m'intéresse, mais pour l'instant pour moi c'est
encore à l'état de rêves, je ne m'y connais pas assez.
et je ne travaille pas dessus en ce moment.

il me semble que dans une architecture où chaque couche est bien conçue,
aucun remplissage de tampon ne devrait causer un pb critique,
mais devrait tjr causer la mise en attente du producteur en attendant
que le consommateur ait libéré un peu de place.

donc amha, c'est ce mécanisme qui doit être peaufiné.
et après, les réglages de priorités et de taille des mémoires tampon,
c'est bien pour l'optimisation, mais ça ne devrais pas avoir d'impact
sur le bon résultat à la fin :-)


j'ai survolé Gtk.Main.Router parce que je pense bien que j'en aurai
besoin un peu plus tard, mais je n'ai pas creusé à fond.

on dirait qu'il y a une file d'attente implémentée dans le type
Request_Item, mais qui ne sert qu'avec Gateway.Request_Asynchronous, et
je n'ai pas eu la patience de découvrir dans quels cas de figure c'est
utilisé.
l'usage basique de Request utilise Gateway.Request_Synchronous,
et si je ne me trompe pas, ça n'utilise pas la file d'attente
implémentée dans le type Request_Item, mais uniquement celle du langage
pour les queues sur l'objet protégé qui sont gérées directement par le
compilateur pas par le développeur.

il faudrait voir comment ça se passe quand une file d'attente de ce type
dépasse les limites prévues : est-ce que ça fait marcher un mécanisme
tel que je l'ai décrit ci-dessus, ou est-ce que ça crash d'une façon ou
d'une autre ?


> Je ferai des tests et j'adapterai en conséquence.

qu'est-ce que ça a donné ? :-)

DrPi

unread,
Jan 20, 2022, 12:37:36 PM1/20/22
to
Je n'ai toujours pas installé la version 2021. Peut-être que je passerai
directement à la version 2022 ;)

Je n'ai pas creusé de ce coté. Je n'ai pas assez de temps pour ça, même
si lire le code de Dmitry serait sûrement très instructif.

DrPi

unread,
Jan 20, 2022, 12:40:05 PM1/20/22
to
J'ai conçu une solution basée sur les indications de Jean-Pierre. Je
n'ai pas fait beaucoup de tests mais ça a l'air de bien fonctionner.

Thomas

unread,
Jan 20, 2022, 3:09:13 PM1/20/22
to
In article <61e99ddf$0$29497$426a...@news.free.fr>, DrPi <3...@drpi.fr>
wrote:

> Le 20/01/2022 à 04:09, Thomas a écrit :
> > In article <60eb51a3$0$32527$426a...@news.free.fr>, DrPi <3...@drpi.fr>
> > wrote:
> >
> >> Le 03/07/2021 à 17:01, Blady a écrit :
> >
> >> > 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.

je n'ai pas eu l'idée de suivre ce lien, mais je crois que tu voulais
donner celui-là à la place :

http://www.dmitry-kazakov.de/ada/gtkada_contributions.htm


> > à ma connaissance, ce qui compte pour résoudre ton pb, c'est les
> > compléments de Dmitry Kazakov

> > en plus celui là a l'air assez léger, surtout que (je peux me tromper)
> > il me semble bien que Gtk.Main.Router est indépendant des autres qui
> > sont fournis en même temps,
> > donc si ce sont uniquement d'autres qui posent pb, il doit bien être
> > possible d'adapter la config pour ne compiler que celui-là !

désolé, à la place de suivre le lien donné, je me suis laissé porté par
google, puis par sourceforge qui m'a fait télécharger la version 3.9 au
lieu de la version 3.29 !

en fait ça dépend au moins de Gtk.Missed (j'ai pas creusé ça non plus).


> Je n'ai pas creusé de ce coté. Je n'ai pas assez de temps pour ça,

le principal c'est que tu aies trouvé qqch qui marche chez toi :-)

> même
> si lire le code de Dmitry serait sûrement très instructif.

je trouve que oui, c'est instructif :-)

disons que ça t'aurais évité de coder ce qu'il avait déjà fait,
désolé de ne pas avoir été assez réactif.

j'avais survolé le fil à l'époque, mais pas le temps d'écrire pour
réagir à tout ce que j'avais lu.
j'ai tendance à penser qu'il vaut tjr mieux tard que jamais, j'espère
que tu es d'accord :-)
0 new messages