Sujet : Re: Question sur les tasks
De : 314 (at) *nospam* drpi.fr (DrPi)
Groupes : fr.comp.lang.adaDate : 18. Oct 2023, 17:55:05
Autres entêtes
Organisation : <https://pasdenom.info/news.html>
Message-ID : <ugp2ld$765$1@rasp.pasdenom.info>
References : 1 2 3
User-Agent : Mozilla Thunderbird
Salut Stéphane,
Le 18/10/2023 à 08:33, Stéphane Rivière a écrit :
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é...).
C'est la prochaine étape. Là, c'était du 'gaffer' pour éviter d'avoir une appli fonctionnelle (au niveau Web, puisque Gnoga ping régulièrement le navigateur - on est en websocket, pas en html -) mais pas au niveau de la connexion SQL (par manque d'activité). Le lendemain matin, ça ne fait pas cossu :)
Si tu veux facilement protéger Msg.Std des accès concurrents par plusieurs tâches, tu peux (temporairement) utiliser un mutex.
Un mutex de base ça se définit comme ça :
protected type Mutex is
entry Lock;
procedure Release;
private
Owned : Boolean := False;
end Mutex;
protected body Mutex is
entry Lock when not Owned is
begin
Owned := True;
end Seize;
procedure Release is
begin
Owned := False;
end Release;
end Mutex;
En début de fonction, un appel à Mutex.Lock.
En fin de fonction, un appel à Mutex.Release.
Le mutex doit être déclaré de façon statique (global par exemple).
Sinon, une autre piste : Peut être que le package Msg nécessite une initialisation (faite par la tâche principale ?) qui n'est pas encore faite/terminée lors de l'appel à Msg.Std dans la tâche SQL_Ping. Le délai permet à l'appel de Msg.Std de se faire après l'initialisation.
Nicolas