A propos des collections partagées

Bonjour,

J’essaye de mettre en place un nouveau processus lié à des collections partagées.

Elles sont créées à l’ouverture, mais restent accessibles uniquement dans le process principal.
Lors d’un nouveau process elles sont indéfinies.

4D v17r2 en mode interprété sous 32bits.
Sous 64 bits même constat.

Avez-vous notez un souci lors de l’utilisation de collections partagées ?
Avez vous des éléments que j’aurai zappés ?

Merci d’avance.
Eric

J’utilise une collection partagée en version v17 (230190) (pas R) en 32 bit (en interprété et /ou compilé) cela fonctionne bien; y compris dans des process différents.
Elle est stockée dans le Storage.

Est-ce que tous les elements qui la constitue sont biens partagés ? (c’est http://forums.4d.com/Post/FR/26781888/0/0/là> que j’ai rencontré la plus grande difficulté de mise en oeuvre)

Salut Éric,
pour utiliser ta collection en interprocess, il fait passer sa référence au process destinataire, je (ne) vois (que) 3 façons de faire :
<code 4D>
//création de la collection
$lettresGrecques_c:=Créer collection partagée(“alpha”;“beta”;“gamma”;“delta”)
<>lettresGrecques_c:=$lettresGrecques_c
Utiliser (Storage)
Storage.lettresGrecques_c:=$lettresGrecques_c
Fin utiliser
//on créé le process qui va utiliser la collection
$testPss_t:=“testPss”
$pss_l:=Nouveau process($testPss_t;0;$testPss_t;$lettresGrecques_c)
</code 4D>

<code 4D>
//méthode testPss
C_COLLECTION($1;$lettresGrecques_c)
C_COLLECTION($lettresGrecquesIP_c)
C_COLLECTION($lettresGrecquesStorage_c)
//paramètre
$lettresGrecques_c:=$1
ASSERT($lettresGrecques_c[0]=“alpha”)
ASSERT($lettresGrecques_c[3]=“delta”)
//variable interprocess
$lettresGrecquesIP_c:=<>lettresGrecques_c
ASSERT($lettresGrecquesIP_c[0]=“alpha”)
ASSERT($lettresGrecquesIP_c[3]=“delta”)
//via Storage
Utiliser (Storage)
$lettresGrecquesStorage_c:=Storage.lettresGrecques_c
Fin utiliser
ASSERT($lettresGrecquesStorage_c[0]=“alpha”)
ASSERT($lettresGrecquesStorage_c[3]=“delta”)
TRACE
</code 4D>

Pas trop d’idée sur ce qui est bien ou pas là dedans, sauf le passage par une interprocess qui interdit l’exécution en préemptif.

Si quelqu’un a d’autres suggestions ou remarques, j’en veux bien…

Pardon Arnaud mais je n’ai rien compris à ton code; cela sert à quoi de créer une variable interprocess ? :-?

Ta ligne 15 fonctionne ou pas ?
Si oui, quel intérêt de la variable interprocess ?

En plus, ton <code 4D>
Utiliser (Storage)
</code 4D> ligne 14 ne sert à rien pour la lecture… :razz:

Ton code est surprenant : pourquoi passer les lettres grecques en paramètre ? Quand le nouveau process est lancé il suffit d’aller lire le storage et de prendre ce qui te convient.

: Manuel PIQUET

En plus, ton <code 4D>
Utiliser (Storage)
</code 4D> ligne 14 ne sert à rien pour la lecture… :razz:
Surtout elle bloquerait le storage en cas d’accès concurrents

Tout fonctionne. Je voulais juste tester 3 façons de lire dans un process une collection créée dans un autre et les 3 marchent (y compris la ligne 15, je ne vois pas en quoi elle te questionne). Concernant l’usage d’une interprocess, je sais qu’en contexte threadsafe on ne peut les utiliser, mais peut-être y trouverai-je un intérêt quand le contexte ne l’est pas (interface, par exemple), je n’en sais rien a priori.

Arnaud fatigue… tiens bon, on est bientôt vendredi :mrgreen:

: Arnaud DE MONTARD

Je voulais juste tester 3 façons de lire dans un process une
collection créée dans un autre
Sauf qu’on parle ici de collection partagées :razz:

: Arnaud DE MONTARD

je ne vois pas en quoi elle te questionne
parce que cela ne sert à rien dans ce contexte puisque tu peux lire le Storage directement et de plus lire la remarque pertinente de Bernard.

: Bertrand SOUBEYRAND

Ton code est surprenant : pourquoi passer les lettres grecques en
paramètre ? Quand le nouveau process est lancé il suffit d’aller lire
le storage et de prendre ce qui te convient.
J’aurai tendance à mettre dans le storage des informations pérennes et dont n’importe quel process peut avoir besoin n’importe quand. Suppose que cette exaltante collection de lettres grecques ne concernent que le process destinataire : pourquoi passer par le storage ? Inversement, si tout process a un besoin vital de cette passionnante collection, le storage est le bon endroit. Du moins je le vois ainsi.

Pour en revenir à la question initiale d’Eric :oops:
Ton code Arnaud (même s’il n’est pas à notre goût ;-)) prouve bien que cela fonctionne…

On ne discute pas là de la pertinence de ce qu’il faut placer ou non dans le Storage ou dans une collection partagée, ou non. Eric veut simplement savoir si cela fonctionne en multiprocess; la réponse est (normalement) : oui

Voici un exemple du code qui ne fonctionne pas, en tout cas qui ne crée pas de collection partagée :

<code 4D>
// les communes
C_COLLECTION(lesCommunes)
lesCommunes:=Créer collection partagée
TOUT SÉLECTIONNER([COLL_COMMUNES])
SÉLECTION VERS TABLEAU([COLL_COMMUNES]PK;_pk;[COLL_COMMUNES]libelleCommune;_name;[COLL_COMMUNES]codePostal;_CP) TRIER TABLEAU(_name;_CP;_pk;>)
Utiliser (lesCommunes)
TABLEAU VERS COLLECTION(lesCommunes;_name;"nom";_CP;“cp”;$_pk;“pk”)
Fin utiliser

C_COLLECTION(lesVilles)
lesVilles:=Créer collection partagée(“Angers”;“Le Mans”;“Tours”) // le triangle d’Or

</code 4D>

Qu’ai-je omis ?

Tu n’as pas lu ce fil http://forums.4d.com/Post/FR/26781888/0/0/ici>

Tout élément faisant partie d’une collection partagée doit être lui-même partagé (valable pour les objets et collections inclus dans ta collection partagée !)

Bon courage : ce n’est pas simple sans les bonnes commandes inexistantes dans 4D actuellement.

Ta collection provenant d’un tableau n’est pas une collection partagée car le résultat de la commande tableau vers collection n’est pas une collection partagée :twisted:

Voici un exemple de code qui fonctionne chez moi (je m’aperçois que je n’utilise pas Tableau vers collection mais je passe par ORDA pour le faire)

<code 4D>
C_OBJET($ES_Avancement)
$ES_Avancement:=ds.Avancement.all()

C_COLLECTION($NouvelleCollection)
$NouvelleCollection:=$ES_Avancement.toCollection(“Libelle, Couleur, Fichier, IDSociete”)

ORDA_CollectionToStorageShared (“AvancementCollection”;$NouvelleCollection)

</code 4D>

as-tu essayé ce cas simple:

<code 4D>
Utiliser (Storage)
Storage.lesVilles:=Créer collection partagée(“Angers”;“Le Mans”;“Tours”)//le triangle d’Or
Fin utiliser

</code 4D>

puis dans ton autre process:

<code 4D>
C_COLLECTION($lesVillesCollection)
$lesVillesCollection:=Storage.lesVilles

</code 4D>

code pas testé :expressionless:

Manuel, merci pour tes réponses.

Cela me semblait plus simple à la lecture de la doc. Même avec “storage” ma collection “lesVilles” avec 3 items est à la ramasse.

Je vais relire la doc sur le sujet et essayer de deviner ce qu’il faut comprendre…

Merci et bon week-end. :pray:

: Eric JUHEL

Qu’ai-je omis ?
Avec cet échantillon tu créés bien des collections partagées, mais tu n’as rien pour les lire dans un autre process.

Création et mémo dans le storage par un premier process :
<code 4D>
C_COLLECTION(lesVilles)
lesVilles:=Créer collection partagée(“Angers”;“Le Mans”;“Tours”)
Utiliser (Storage)
Storage.triangleOr:=lesVilles
Fin utiliser
</code 4D>

lecture depuis un autre process :
<code 4D>
C_COLLECTION(lesVilles;$lesVilles)
Utiliser (Storage)
lesVilles:=Storage.triangleOr
$lesVilles:=Storage.triangleOr
Fin utiliser
ASSERT(lesVilles[0]=“Angers”)
ASSERT($lesVilles[0]=“Angers”)
TRACE
</code 4D>

@adm:

ça ne sert à rien de lire le storage avec utiliser et fin utiliser

C_COLLECTION(lesVilles;$lesVilles)
Utiliser(Storage)
lesVilles:=Storage.triangleOr
$lesVilles:=Storage.triangleOr
Fin utiliser