PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → tache parallele
tache parallele
Débuté par S.KANTE, 17 jan. 2018 14:18 - 12 réponses
Membre enregistré
5 messages
Posté le 17 janvier 2018 - 14:18
Bonjour tout le monde

J'ai actuellement un souci qui me casse vraiment la tête et j'ai besoin de vos aides.
Mon problème est le suivant:
je suis sur un projet dans lequel il est nécessaire d'utiliser le parallélisme des traitements.
j'ai des répertoires dans lesquels se trouvent des milliers de fichier organisés, il est question que l'utilisateur sélectionne un répertoire pour afficher son contenu.
Présentement tout marche bien mais l'affichage est lent , alors j'ai utilisé la notion de traitement parallèle pour pouvoir optimiser le traitement, mais je n'arrive pas, aider moi svp.
Merci d'avance.

mes code:

PROCEDURE Fonction_liste_fichier(chemin_rep est une chaîne)
ResListeFichier = fListeFichier(chemin_rep+"\*.pdf*",frNonRécursif)

SI ResListeFichier > 0 ALORS
nbfichier = 1 + ChaîneOccurrence(ResListeFichier, RC)
FIN
RENVOYER ResListeFichier


sListefichier sont des chaînes
sListefichier=Fonction_liste_fichier(Chemin_classeur)
ResListeFichier=Fonction_liste_fichier(Chemin_classeur)

POUR TOUTE CHAÎNE UnFichier DE ResListeFichier SEPAREE PAR RC
soit t est une TâcheParallèle =TâcheParallèleExécute(fonction_extrait_chaine,(UnFichier),tpoCopieLégèreContexteHFSQL)
TâcheParallèleExécuteAprès(t,procedure_Afficher_table,(ValeurRenvoyéeTâchePrécédente,UnFichier),tpoThreadPrincipal)
PROCEDURE INTERNE procedure_Afficher_table(Fic,fichier est une chaîne)
TableAjouteLigne(TABLE_fichier_importation_contenu,"",Fic,fTaille(fichier),fichier)
FIN

FIN
Membre enregistré
996 messages
Posté le 17 janvier 2018 - 14:22
Bonjour,

enleve tpoThreadPrincipal de

TâcheParallèleExécuteAprès(t,procedure_Afficher_table,(ValeurRenvoyéeTâchePrécédente,UnFichier),tpoThreadPrincipal)

jordan
Posté le 17 janvier 2018 - 16:39
Bonjour,
Tu as déjà posé cette question, à laquelle j'ai répondu.
Qu'est-ce qui ne va pas avec ma précédente réponse ?

Frédéric.

"S.KANTE" a écrit dans le message de groupe de discussion :
20185044c75e9d5c666ff1d818295edd0f7e@news.pcsoft.fr...

Bonjour tout le monde

J'ai actuellement un souci qui me casse vraiment la tête et j'ai besoin de
vos aides.
Mon problème est le suivant:
je suis sur un projet dans lequel il est nécessaire d'utiliser le
parallélisme des traitements.
j'ai des répertoires dans lesquels se trouvent des milliers de fichier
organisés, il est question que l'utilisateur sélectionne un répertoire pour
afficher son contenu.
Présentement tout marche bien mais l'affichage est lent , alors j'ai utilisé
la notion de traitement parallèle pour pouvoir optimiser le traitement, mais
je n'arrive pas, aider moi svp.
Merci d'avance.

mes code:

PROCEDURE Fonction_liste_fichier(chemin_rep est une chaîne)
ResListeFichier = fListeFichier(chemin_rep+"\*.pdf*",frNonRécursif)

SI ResListeFichier > 0 ALORS
nbfichier = 1 + ChaîneOccurrence(ResListeFichier, RC)
FIN
RENVOYER ResListeFichier


sListefichier sont des chaînes
sListefichier=Fonction_liste_fichier(Chemin_classeur)
ResListeFichier=Fonction_liste_fichier(Chemin_classeur)

POUR TOUTE CHAÎNE UnFichier DE ResListeFichier SEPAREE PAR RC
soit t est une TâcheParallèle
=TâcheParallèleExécute(fonction_extrait_chaine,(UnFichier),tpoCopieLégèreContexteHFSQL)
TâcheParallèleExécuteAprès(t,procedure_Afficher_table,(ValeurRenvoyéeTâchePrécédente,UnFichier),tpoThreadPrincipal)
PROCEDURE INTERNE procedure_Afficher_table(Fic,fichier est une chaîne)
TableAjouteLigne(TABLE_fichier_importation_contenu,"",Fic,fTaille(fichier),fichier)
FIN

FIN
Membre enregistré
5 messages
Posté le 17 janvier 2018 - 17:13
excusez moi je n'avais pas vu ta reponse
Membre enregistré
5 messages
Posté le 17 janvier 2018 - 17:22
si je l'enlev voici ce qu'il m'affiche:


Erreur à la ligne 62 du traitement Procédure interne procedure_Afficher_table.
Le champ 'TABLE_fichier_importation_contenu' est inconnu.

**********************************************

----- Informations techniques -----

Appel WL :
Traitement de 'Procédure interne procedure_Afficher_table' (FEN_importation.TABLEH_importation), ligne 62, thread 0

Que s'est-il passé ?
Le champ 'TABLE_fichier_importation_contenu' est inconnu.

Code erreur : 1017
Niveau : erreur fatale

Dump de l'erreur du module 'wd220vm.dll' (22.0.318.0).
Identifiant des informations détaillées (.err) : 1017
Informations supplémentaires :
EIT_PILEWL :
Procédure interne procedure_Afficher_table (FEN_importation.TABLEH_importation), ligne 62
EIT_DATEHEURE : 17/01/2018 16:24:32
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <33>
Membre enregistré
949 messages
Posté le 18 janvier 2018 - 18:54
Coucou,

1) tpoCopieLégèreContexteHFSQL Dans ton cas non, place un tpoCopieDifféréeContexteHFSQL
https://doc.pcsoft.fr/?1000021211

2) Moi je ferais dans ce style

// Déclaration de plusieurs tâches et exécution d'un traitement à la fin de toutes ces tâches.

MaDescriptionTâche est une Description de TâcheParallèle
tabMesTâches est un tableau de TâcheParallèle // Résultat des fonctions tâches parallèles

// Tâche N°1
MaDescriptionTâche..Procédure = Exemple2_Etape1

// Exécute les tâches parallèles
// On ajoute la tâche renvoyée à un tableau de tâches
// pour pouvoir les réutiliser dans la fonction TâcheParallèleExécuteAprèsToutes
Ajoute(tabMesTâches, TâcheParallèleExécute(MaDescriptionTâche))

// Tâche N°2
MaDescriptionTâche.Procédure = Exemple2_Etape2
Ajoute(tabMesTâches, TâcheParallèleExécute(MaDescriptionTâche))

// On donne la procédure à exécuter une fois que
// toutes les tâches contenues dans le tableau tabMesTâches sont terminées
TâcheParallèleExécuteAprèsToutes(tabMesTâches, Exemple2_Fin, (), tpoThreadPrincipal)

Reference: https://doc.pcsoft.fr/?1000021211

Tu place la mise a jour de ta table dans la procedure : "Exemple2_Fin"

Tu peut regarder sur coté de l'example unitaire :
Exemples unitaires (WINDEV) : Utilisation des tâches parallèles
[ - ]
 Les tâches parallèles permettent notamment d’accélérer les temps de traitement et d'améliorer la réactivité d’une application.
Cet exemple présente les fonctions et types de variables nécessaires à l'utilisation des tâches parallèles :
- exécution de tâches parallèles,
- interaction avec les champs,
- tâches de continuation.

Reference: https://doc.pcsoft.fr/?1000021211

Si tu as besoin de plus d'info reposte et on en discute.

--
In üs we trust - Autopsie Volume 1 disponible le 01-23 au dépôt de ton armurier.
Membre enregistré
5 messages
Posté le 19 janvier 2018 - 10:10
Bonjour
Je remercie tous les amis qui ont contribué à la résolution de ce problème.
Le problème est finalement résolu en utilisant les threads.
l'utilisateur peut maintenant afficher plus de 2000 fichiers sans bloquer l'interface.
Membre enregistré
5 messages
Posté le 19 janvier 2018 - 11:51
Bonjour
Avec la fonction "fListeFichier" je remarque un retard de 3 à 5 seconde lors que le nombre de fichier atteins 1000 fichiers.
il y'a t-il une autre méthode ou plus performante ?
Svp.
merci d'avance.
Membre enregistré
949 messages
Posté le 19 janvier 2018 - 17:02
Coucou,

Tu peut essayer passer par un assembly dotnet

PUBLIC static string[] GetFiles(
string path,
string searchPattern
)

Retourne les noms des fichiers (y compris leurs chemins d'accès) qui correspondent au modèle de recherche spécifié dans le répertoire spécifié.
Reference: https://msdn.microsoft.com/fr-fr/library/wz42302f(v=vs.110).aspx

--
In üs we trust - Autopsie Volume 1 disponible le 01-23 au dépôt de ton armurier.
Posté le 19 janvier 2018 - 18:11
Merci bien mon ami
Je suis en windev
Membre enregistré
949 messages
Posté le 19 janvier 2018 - 18:29
Coucou

S.KANTE a écrit :
Merci bien mon ami
Je suis en windev


Moi aussi ;)

Utiliser des assemblages .NET dans un projet
http://doc.pcsoft.fr/fr-FR/?2012002

Essaye de jetter un oeil sur ce thread, j'y explique comment surcharger une fonction WLanguage avec un assembly DotNet ^^

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/213673-aide-sur-expressions-regulieres/read.awp

--
In üs we trust - Autopsie Volume 1 disponible le 01-23 au dépôt de ton armurier.
Message modifié, 19 janvier 2018 - 18:31
Membre enregistré
281 messages
Posté le 19 janvier 2018 - 20:17
Bonsoir,

fListeFichier doit être utilisé avec une fonction callback car si il y a beaucoup de fichiers il faut le temps nécessaire pour alimenter la chaine.
Membre enregistré
9 messages
Posté le 16 mai 2025 - 11:01
Bonjour,
Je rencontre le même souci mais en WEBDEV.
J'ai un formulaire de saisie que j'aimerai enregistrer toutes les x secondes (Comme ce que fait Word)
J'ai essayé le code ci-dessous mais j'ai un message d'erreur lorsque je souhaite récupérer la valeur d'un champ pour l'ajout dans la BDD.

MaDescriptionTâche est une Description de TâcheParallèle
tabMesTâches est un tableau de TâcheParallèle

// Tâche N°1
MaDescriptionTâche..Procédure = pl_lance_TIMER //Lance un chrono de x seconde

Ajoute(tabMesTâches, TâcheParallèleExécute(MaDescriptionTâche))


//A la fin du chrono lance la procédure qui sauvegarde dans la BDD les informations de la page
TâcheParallèleExécuteAprèsToutes(tabMesTâches, pl_enregistre_TMP, (), tpoCopieDifféréeContexteHFSQL)

Savez-vous comment résoudre le problème ?