Deutsch   English   Français   Italiano  
<ugmt10$jj2$1@rasp.pasdenom.info>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.mixmin.net!proxad.net!feeder1-2.proxad.net!usenet-fr.net!pasdenom.info!.POSTED.2a01:e0a:472:70f0:3d6c:9171:a904:6e06!not-for-mail
From: DrPi <314@drpi.fr>
Newsgroups: fr.comp.lang.ada
Subject: Re: Question sur les tasks
Date: Tue, 17 Oct 2023 23:06:37 +0200
Organization: <https://pasdenom.info/news.html>
Message-ID: <ugmt10$jj2$1@rasp.pasdenom.info>
References: <ugmat3$320j2$1@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Tue, 17 Oct 2023 21:06:40 -0000 (UTC)
Injection-Info: rasp.pasdenom.info; posting-account="314@usenet"; posting-host="2a01:e0a:472:70f0:3d6c:9171:a904:6e06";
	logging-data="20066"; mail-complaints-to="abuse@pasdenom.info"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha256:uMYzKvP1wIi9U1Vo6vuOiKMgncjkNZWJzWldkRCHbyk=
In-Reply-To: <ugmat3$320j2$1@dont-email.me>
Content-Language: fr
Bytes: 3623
Lines: 64

Salut Stéphane,

Le 17/10/2023 à 17:57, Stéphane Rivière a écrit :
> Bonjour à toutes et tous,
> 
> Msg.Std ou Sql.Ping ne sont pas réentrants 
> mais comme c'est de l'affichage de log ou de la pure lecture de DB, je 
> ne m'en fait pas pour l'instant...
> 
> L'appel à C balaye la table des DB ouvertes et envoie un "SELECT 1" 
> bidon à toutes les DB qui le nécessitent (donc pas les SQLite par exemple).
> 
> Mais au démarrage de l'applic, pour que la line B affiche le message de 
> log :
> 
> TestGui.SQL_Ping > Armed for 3600s cycles
> 
> Il faut que je mette une ligne A avec un appel à delay...
> 
> J'aimerai bien comprendre le truc (et baisser mon ignorance).
> 
> 
> ---------------------------------------
>     task SQL_Ping;
> 
>     task body SQL_Ping is
>        Delay_Value : Duration := 3600.0;  -- Wait 1 hour between pings
>     begin
> A      delay 0.1; --  Mandatory to displaying the message below
> B      Msg.Std ("TestGui.SQL_Ping > Armed for " &
>                 Trim_Left (Field_By_Index (From_Latin_1 (Duration'Image 
> (Delay_Value)), 1, ".")) & "s cycles");
>        while True loop
>           delay Delay_Value;
>           Msg.Dbg ("TestGui.SQL_Ping > Sent");
> C        Sql.Ping;
>        end loop;
>     end SQL_Ping;
> 
> ---------------------------------------
> 
Je ne vois pas de problème lié au tasking de Ada.
Par contre, je vois un problème de tasking au sens général 
(indépendamment du langage).

Tu dis que la procédure Msg.Std n'est pas réentrante mais que ce n'est 
pas un problème. Or Msg.Std est appelée à partir de la tâche SQL_Ping et 
sûrement à partir d'autres tâches comme la tâche principale. A partir de 
là, il y a un risque de dysfonctionnement.
Par exemple, si Msg.Std est appelée par la tâche principale puis, avant 
qu'elle ne se termine, est également appelée par la tâche SQL_Ping, il y 
a problème puisque la fonction n'est pas réentrante.
Le fait d'ajouter un délai au début de la tâche SQL_Ping permet à la 
fonction Msg.Std de se terminer dans la tâche principale avant d'être 
appelée dans SQL_Ping. Et tout semble fonctionner parfaitement. Mais ce 
n'est qu'une illusion. Il est fort probable que dans d'autres conditions 
de fonctionnement (charge processeur différente, code modifié...), le 
délai doive être modifié.

Une fonction/procédure appelée à partir de plusieurs tâches DOIT être 
conçue pour ça (protection avec un mutex, utilisation un objet protégé...).

Nicolas