PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Tache Parallèle et accès IHM - WD23
Tache Parallèle et accès IHM - WD23
Débuté par Jean-Jacques, 03 sep. 2020 09:55 - 9 réponses
Membre enregistré
55 messages
Posté le 03 septembre 2020 - 09:55
Hello tout le monde,

Je rencontre un soucis concernant la nécessité d'accéder à l'IHM d'une fenêtre depuis des tâches parallèles.

J'ai donc des taches parallèles qui sont lancées depuis une procédure globale (dans le Thread Principale)
Tout va bien de ce côté là.

Dans chaque tâche, je fais appel, à un moment donné, à l'IHM (modification d'un libellé).
J'utilise donc pour ça une procédure globale avec l'option "Exécuter dans le Thread Principale", cochée.
Cette procédure globale va modifier mon objet dans l'IHM.

c'est typiquement l'exemple donné dans l'aide sur les Taches Parallèles de Windev.

Mais l'application se bloque complètement et pas de messages d'erreur...

J'ai essayé d'appeler la procédure avec la commande ExecuteThreadPrincipale(), mais le résultat est identique...

Je précise que la fenêtre où les objet sont modifiés est une fenêtre ouverte avec la commande OuvreFillle()
Je précise également que je suis en version 23.

si vous avez une idée ??

Merci d'avance !!

--
cordialement,

jjacques68
Posté le 03 septembre 2020 - 13:48
Un p'tit morceau de code pour comprendre?

tu as essayé DemandeMiseAJourIHM ? https://doc.pcsoft.fr/?1000021378
Membre enregistré
55 messages
Posté le 03 septembre 2020 - 15:28
merci pour le suivi , alors voici le bout de code qui lance les taches parallèles :

tabListeTache est un tableau de TâchesParallèles
MaTache est une TâcheParallèle

tabListe_Machine est un tableau de chaînes = ["Machine1", "Machine2", "Machine3", "Machine4"]

POUR i = 1 À tabListe_Machine..Occurrence
MaTache = TâcheParallèleExécute(Procedure_Tache,(tabListe_Machine[i]), tpoCopieComplèteContexteHFSQL)
TableauAjoute(tabListeTache,MaTache)
FIN

TâcheParallèleAttendToutes(tabListeTache)


Voici le code de Procedure_Tache() :

Procedure Procedure_Tache(sMaMachine est une chaîne = "")

HExécuteRequête(sMaRequete,hRequêteDéfaut,gdDateDebut)

//passage après passage...
POUR TOUT sMaRequete
//...
// c'est ici que je fait appel à la procédure Globale pour modifier l'IHM
// cette procédure est de type "Executée dans le Thread Principale
//...
FIN


--
cordialement,

jjacques68
Membre enregistré
55 messages
Posté le 03 septembre 2020 - 15:30
oulala, y a pas de colorations syntaxique sur le forum... désolé pour la difficulté à lire le code...

Par contre je viens de me rendre compte qu'en mettant le premier code (donc celui qui lance les tâches parallèles) dans un "Thread", là ça marche !!???

--
cordialement,

jjacques68
Membre enregistré
55 messages
Posté le 03 septembre 2020 - 15:31
Un bémol quand même :

interaction avec l'IHM fonctionne maintenant, mais ça me fait "ramer" un peu les tâches !!!

c'est normal ça ?

--
cordialement,

jjacques68
Membre enregistré
26 messages
Posté le 03 septembre 2020 - 18:56
Il est possible que ça rame avec tpoCopieComplèteContexteHFSQL essai avec tpoCopieLégèreContexteHFSQL
Tu peux sûrement optimiser le code :)
Membre enregistré
26 messages
Posté le 03 septembre 2020 - 18:56
Il est possible que ça rame avec tpoCopieComplèteContexteHFSQL essai avec tpoCopieLégèreContexteHFSQL
Tu peux sûrement optimiser le code :)
Membre enregistré
55 messages
Posté le 03 septembre 2020 - 22:11
déjà essayé, c'est pire :)

ben en fait, dans chaque tâches parallèles, je ne fais qu'afficher une jauge de progression en plus des traitements.

par exemple j'ai une boucle qui tourne sur le résultat d'une requête.
donc pour environ 1000 enregistrements, je fais donc 1000 fois le traitement.
cela prend en moyenne 1 et 2 secondes par tache (j'en ai 4 qui tournent en parallèle).
c'est tout à fait acceptable.
(sans les tâches parallèles, j'était dans les 8 secondes...)

mais avec la jauge, je suis entre 4 et 5 secondes !!!!
ça ça me dérange, c'est vraiment dommage, car la fenêtre de progression est sympas... :)

--
cordialement,

jjacques68
Posté le 07 septembre 2020 - 15:38
Bonjour,

La fonction TâcheParallèleAttendToutes() peut être bloquante si une tâche parallèle fait appel au thread principal.

Tu peux utiliser ce code à la place de la ligne TâcheParallèleAttendToutes(tabListeTache) :
nIndice est un entier = 1
TANTQUE (nIndice = 1 À tabListeTache..Occurrence)
SI tabListeTache[nIndice]..Terminée ALORS
nIndice++
SINON
Temporisation(25, tempoSourisEtClavier)
FIN
FIN
Membre enregistré
55 messages
Posté le 07 septembre 2020 - 18:12
bonne remarque ! merci !

j'avais pas fait gaffe à cette subtilité ! pourtant c'est bien marqué dans l'aide de cette fonction !!

--
cordialement,

jjacques68