PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Passage source données dans paramètres de tâches parallèles
Passage source données dans paramètres de tâches parallèles
Iniciado por AZIZ AIT ZAGHAR, mar., 25 2024 6:45 AM - 5 respostas
Membro registado
12 mensagems
Publicado em março, 25 2024 - 6:45 AM
Bonjour à tous,

J'essai de mettre des tâches parallèles dans mon code, par conte si vous voyez d'autre chose pas très orthodoxe sur d'autre sujet par ex. l'utilisation des Interface (POO) ou autre ... ne m'en tenez pas rigueur, j'explore ...

Code avec tâches parallèles :

//-- Code pour le lancement en taches parallèles des enregistrements
nItemErreur est un entier sur 8 octets
tabTâches est un tableau de TâchesParallèles
maTâche est une TâcheParallèle

//-- Lancer le chargement de l'enregistrement à l'aide d'une tâche parallèle
maTâche = TâcheParallèleExécute(ChargerEnregistrement,(sNomClasseEnfant,sNomIDFichierEnfant,sdSourceDeDonnées), tpoCopieDifféréeContexteHFSQL)


PROCEDURE INTERNE ChargerEnregistrement(LOCAL sNomClasseEnfant_LOCAL, LOCAL sNomIDFichierEnfant_LOCAL, LOCAL sdSourceDeDonnées_LOCAL)

//-- Charger l'enregistrement dans un modèle
iMonItemEnCours est un I_CRUD <- allouer un CGénérique(sNomClasseEnfant_LOCAL)

//-- Lire l'enregistrement
iMonItemEnCours.CLit({"sdSourceDeDonnées_LOCAL." + sNomIDFichierEnfant_LOCAL})

//-- Ajoute l'enregistrement au tableau
TableauAjoute(:m_tabTravail, iMonItemEnCours.p_pclTravail)

RENVOYER Vrai
FIN

//-- Mémorise cette tâche dans un tableau
Ajoute(tabTâches, maTâche)

//-- Attend la fin de l'exécution des tâches
TâcheParallèleAttendToutes(tabTâches)

//-- Vérifier que toutes les membres sont validés (non utilisé pour le moment)
POUR TOUT maTâche de tabTâches
SI maTâche..ValeurRenvoyée = Faux ALORS
nItemErreur++
FIN
FIN


J'essai de passer une source de données, ici <sdSourceDeDonnées>, en paramètre de la tâche parallèle et ça ne fonctionne pas, ça me donne une chaine de l'autre coté dans la variable local <sdSourceDeDonnées_LOCAL> .

Le message d'erreur est le suivant :
Le passage du paramètre 3 a provoqué une erreur.
Un élément de type 'chaîne ANSI' ne peut pas être converti vers le type 'objet source de données'.

J'ai typé la source de données <sdSourceDeDonnées_LOCAL> est une Source de Données dans les paramètres de la procédure interne, pas de changement.

En mode pas à pas avec un point d'arrêt dans la procédure interne j'ai :

- sdSourceDeDonnées_LOCAL contient une chaine du type = "_SOURCE_sdSourceDeDonnées_18"
- sdSourceDeDonnées qui est la source de données hors procédure interne donne bien une source de données mais vide

le passage de la source de données dans les paramètres me convertie donc la source de données en une chaine de caractères qui contient le nom de la source de données d'origine.

Là, je sèche !

Par avance merci.

Aziz
Publicado em março, 27 2024 - 11:08 AM
Bonjour.

maTâche = TâcheParallèleExécute(ChargerEnregistrement,(sNomClasseEnfant,sNomIDFichierEnfant,sdSourceDeDonnées), tpoCopieDifféréeContexteHFSQL)

Typer sdSourceDeDonnées comme une source de données
Membro registado
3.891 mensagems
Popularité : +227 (347 votes)
Publicado em março, 28 2024 - 1:52 AM
Bonjour,
Tu ne types pas les paramètres de ta procédure interne.

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
12 mensagems
Publicado em março, 30 2024 - 9:29 AM
Bonjour,

Merci pour vos réponses, comme précisé dans mon message, j'ai typé mes paramètres et cela ne fonctionne pas plus.

1 - Si je type ça me déclenche une erreur :
Le passage du paramètre 3 a provoqué une erreur.
Un élément de type 'chaîne ANSI' ne peut pas être converti vers le type 'objet source de données'.

2 - Si je ne type pas d'erreur :
je récupère une chaine de caractères dans la source de données "_SOURCE_sdSourceDeDonnées_18"

J'ai remplacé les paramètres par un tableau de paramètres pour voir si les paramètres ne sont pas limités à des types simples, mais finalement non, je récupère bien un tableau de l'autre coté mais la source de données est encore une chaine de caractères.

C'est étrange, avant l'entrée dans la procédure interne j'ai bien mes données dans ma source de données et une fois dans la procédure interne la variable local contient une chaine de caractères qui est le nom de la source de données.

Est ce quelqu'un a déjà passé des objets complexes en paramètre d'une tâche parallèles ?
Membro registado
3.891 mensagems
Popularité : +227 (347 votes)
Publicado em março, 30 2024 - 9:47 AM
Tu passes ton paramètre par valeur, as tu tenté le passage par adresse (sans le LOCAL) ?
Tu utilises une procédure interne, elle "voit" les variable de la procédure/fonction principale. Tu peux éventuellement déclarer la source utilisée dans ta procédure principale (ce n'est pas très propre mais bon ...)
En désespoir de cause, tu peux passer en paramètre non pas la SD, mais le résultat de la sérialisation de celle ci. Il suffira de désérialiser dans la procédure interne.

Ce type d'erreur survient aussi lorsque l'on passe en paramètre un champ de type date ou heure. Le paramètre d'appel doit être SAI_MonChampDate..Valeur

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
12 mensagems
Publicado em março, 30 2024 - 6:12 PM
J'ai supprimé le LOCAL et ça passe sans erreur, je rentre dans la procédure interne, mais la source de données reste désespérément vide.

J'ai une erreur sur la ligne :

MonItemEnCours.CLit({"sdSourceDeDonnées_LOCAL" + "." + sNomIDFichierEnfant_LOCAL})


L'élément 'sdSourceDeDonnées_LOCAL.ID_Désignation_Traduction' est inconnu.

Par contre, je me posait la question, si plusieurs tâches sont lancées, le fait de ne pas mettre LOCAL vont-elles manipuler la même "instance" de sdSourceDeDonnées_LOCAL ?

Vu la situation, je penses que je vais rester sur un version séquentiel, mais si quelqu'un à une explication je suis preneur.

P.S : Voroltinquo ta contribution sur un poste au sujet du sujet CRUD générique (il y a maintenant 1 an) m'a été d'une grande aide ! merci.