PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Taches paralleles et mise à jour écran : impossible ?
Taches paralleles et mise à jour écran : impossible ?
Iniciado por christophe.pradel, 04,ene. 2019 15:51 - 12 respuestas
Publicado el 04,enero 2019 - 15:51
Bonjour à tous.

J'essaye de tirer parti des taches parallèles, mais je tombe sur un problème et j’apprécierais des retours d'expérience.

L'objectif :
J'ai un Tableau de bord dont chaque Widget en géré par une fenêtre interne indépendante
Je souhaiterais que tous les Widgets se dessinent dans le TB en parallèle

La Méthode :
J'ai utilisé le principe des tâches parallèles en identifiant pour chaque widget :
- une tache1 chargée de la collecte d'informations, lancée avec TacheParalleleExecute
- une tache2 chargée de la représentation des données à l'écran lancée avec TacheParalleleExecuteApres(<tache1>)

La déception :
Dans tache2, j'ai dû utiliser ThreadExecutePrincipal pour pouvoir manipuler les champs de mes fenêtres internes.
Sans cela, on a une erreur à l'exécution : L'accès aux champs est interdit dans une tache parallèle.
Du coup, ce qui devrait être exécuté en parallèle pour chaque Widget, semble se passer en file indienne dans le thread principal, ce qui ne permet pas d'atteindre mon objectif !

Les fenêtres internes associées à chaque Widget sont indépendantes, il n'y avait donc pas de risque de "conflits" d'accès d'un même champ par deux taches parallèles.

Y aurait-il une façon d'arriver à mon objectif de parallélisation des affichages ?

Merci pour vos Retours

Christophe
Miembro registrado
63 mensajes
Publicado el 07,enero 2019 - 10:58
Bonjour

La déception... souvent le cas avec les nouvelles fonction sans intérêt...
Je te conseille plusieurs choses après m'être cassé les dents plusieurs fois.
Évite Tacheparallele et utilise ThreadExecute c'est beaucoup mieux et stable
ExecuteTheadPrincipal est a fuir aussi Une gestion des événements est bien meilleure (Evenement() / PostMessage() ou SendMessage())
ExecuteTheadPrincipal est bloquant il me semble c'est pour ca que ton affichage n'est pas parallélisé.

Méfie toi des FenInternes / Widget le refresh est vraiment étrange parfois!!

Courage a toi

--
Nicolas Magnien
oXalis [Supervision Industrielle - Procédés Batch - ERP - MES]
www.decobecq-automatismes.fr
Miembro registrado
165 mensajes
Publicado el 07,enero 2019 - 11:04
Bonjour,

Si une tâche parallèle doit s'exécuter dans le thread pincipal (comme votre tâche2), il faut le préciser en paramètre lors de la création de la tâche (voir la constante tpoThreadPrincipal)
Publicado el 07,enero 2019 - 15:17
Merci pour vos réponses.

J'avais commencé en effet par ThreadExecute, mais j'avais été séduit par le principe "ExecuteAprès" des tâches parallèles.

Je vais donc essayer de revoir ma copie, sans être certain que la parallélisation des affichages sera effective

Je ferai un retour si j'ai réussi !
Miembro registrado
548 mensajes
Publicado el 08,enero 2019 - 21:58
sinon utilise le mvp et la fonction :
DemandeMiseAJourIHM

c'est tres efficace, et pas de soucis de thread

--
José
Mensaje modificado, 08,enero 2019 - 21:59
Miembro registrado
37 mensajes
Publicado el 10,enero 2019 - 11:06
Bonjour Christophe,

Je n'ai aucun soucis avec TâcheParallèleExécute, je n'utilise d'ailleurs cette fonction que dans le cadre de l'affichage des différents widget de mon tableau de bord, et sont parfaitement parallélisés. Ailleurs j'utilise essentiellement des threadExecute.

Par contre, je fonctionne différemment : je ne sépare pas de la même manière l'affichage, du chargement des données (correspondant à tes 2 tâches). Je n'ai qu'une seule tâche dans laquelle je distingue simplement ces 2 traitements, ainsi l'affichage d'un 1er widget peut être réalisé pendant le chargement d'une autre. C'est ton TacheParalleleExecuteApres qui à mon avis provoque tes traitements "en file indienne".

Pour chaque tuile donc, j'appelle TâcheParallèleExécute(maProc), et dans "maProc", je charge mes données puis ExécuteThreadPrincipal(maProc2) (certainement PAS bloquant !!) avec une procédure qui ne traite que de l'affichage.

Conclusion :
- TâcheParallèleExécute n'est pas sans intérêt
- ExecuteTheadPrincipal n'est certainement pas à fuir
- Évitons de se compliquer la vie avec une gestion des évènements qui ne me semble pas répondre au pb posé
Je ne suis pas le dernier à râler contre Windev, mais il y a ici un fonctionnement logique qui nécessite d'être simplement compris.
Publicado el 10,enero 2019 - 11:34
Merci Cedric, d'avoir pris le temps de m'expliquer ta méthode.

Je vais essayer de la mettre en oeuvre et je ferai un post pour plus d'info ou clore le sujet.

Christophe
Publicado el 10,enero 2019 - 15:41
Cédric,

Je viens de tenter de changer ma façon de faire en suivant tes conseils.

Malheureusement, je n'ai toujours pas de parallélisme des affichages.

Pour résumer, voici ma façon de faire :

- Dans le code de fin d'initialisation de chaque FI associée à un widget, j'appelle une procédure de traitement en tache parallèle
- Dans la procédure de traitement (locale à chaque FI), après avoir chargé les données, j’appelle une procédure d'affichage avec ExecuteThreadPrincipal

En mettant des traces horodatées en début et fin de ces appels et procédures, et après les avoir reclassées chronologiquement (car dans la fenêtre de trace, les lignes apparaissent en désordre !), j'obtiens la séquence de trace suivante :

15:28:39:46 - FI Widget 1 Avant appel traitement en TacheParallele
15:28:39:53 - FI Widget 1 Après appel traitement en TacheParallele
15:28:39:53 - FI Widget 1 Début du traitement
15:28:39:55 - FI Widget 1 ExecuteThreadPrincipal(
15:28:39:62 - FI Widget 2 Avant appel traitement en TacheParallele
15:28:39:63 - FI Widget 2 Après appel traitement en TacheParallele
15:28:39:63 - FI Widget 2 Début du traitement
15:28:39:65 - FI Widget 2 ExecuteThreadPrincipal(
15:28:39:73 - FI Widget 3 Avant appel traitement en TacheParallele
15:28:39:73 - FI Widget 3 Après appel traitement en TacheParallele
15:28:39:73 - FI Widget 3 Début du traitement
15:28:39:76 - FI Widget 3 ExecuteThreadPrincipal(
15:28:39:83 - FI Widget 4 Avant appel traitement en TacheParallele
15:28:39:84 - FI Widget 4 Après appel traitement en TacheParallele
15:28:39:84 - FI Widget 4 Début du traitement
15:28:39:86 - FI Widget 4 ExecuteThreadPrincipal(
15:28:39:93 - FI Widget 5 Avant appel traitement en TacheParallele
15:28:39:93 - FI Widget 5 Après appel traitement en TacheParallele
15:28:39:93 - FI Widget 5 Début du traitement
15:28:39:95 - FI Widget 5 ExecuteThreadPrincipal(
15:28:39:97 - FI Widget 1 Début de la procédure d'affichage
15:28:40:03 - FI Widget 1 Fin de la procédure d'affichage
15:28:40:03 - FI Widget 2 Début de la procédure d'affichage
15:28:40:03 - FI Widget 1 retour de ExecuteThreadPrincipal(
15:28:40:03 - FI Widget 1 Fin du traitement
15:28:40:06 - FI Widget 2 Fin de la procédure d'affichage
15:28:40:06 - FI Widget 3 Début de la procédure d'affichage
15:28:40:06 - FI Widget 2 retour de ExecuteThreadPrincipal(
15:28:40:06 - FI Widget 2 Fin du traitement
15:28:40:08 - FI Widget 3 Fin de la procédure d'affichage
15:28:40:08 - FI Widget 4 Début de la procédure d'affichage
15:28:40:08 - FI Widget 3 retour de ExecuteThreadPrincipal(
15:28:40:08 - FI Widget 3 Fin du traitement
15:28:40:11 - FI Widget 4 Fin de la procédure d'affichage
15:28:40:11 - FI Widget 5 Début de la procédure d'affichage
15:28:40:11 - FI Widget 4 retour de ExecuteThreadPrincipal(
15:28:40:11 - FI Widget 4 Fin du traitement
15:28:40:23 - FI Widget 5 Fin de la procédure d'affichage


On constate qu'il semble bien y avoir un défaut de parallélisme.

Et effectivement à l'écran, on voit les widgets se mettre à jour les uns après les autres

Je ne sais plus trop où chercher...
Miembro registrado
954 mensajes
Publicado el 10,enero 2019 - 16:20
Coucou,

Y a un example sur la LST 103 :

UN TABLEAU DE BORD TOUJOURS RAPIDE MÊME AVEC DES WIDGETS “LOURDS” (WINDEV)

Cet article présente 3 solutions pour rendre vos widgets asynchrones et ainsi fluidifier l’utilisation d’un tableau de bord.


--
In üs we trust - #92i - #LaPiraterieNestJamaisFinie
Mensaje modificado, 10,enero 2019 - 16:22
Publicado el 10,enero 2019 - 17:00
Merci Charly pour l'info

Reste à ce que je le retrouve dans nos archives !
Miembro registrado
37 mensajes
Publicado el 11,enero 2019 - 11:31
Je me suis mal exprimé, quand je dis "pour chaque tuile" (=widget), je ne veux pas dire qu'on exécute TâcheParallèleExécute dans le code de chaque widget !
Pour moi tout se fait dans la fenêtre contenant le tableau de bord. J'ai une seule procédure InitToutLesWidgets, qui appelle x fois TâcheParallèleExécute (en utilisant un tableau de TâchesParallèles), et dans chaque procédure liée à TâcheParallèleExécute (différente pour afficher chaque widget), on a la recherche des données (chez moi c'est un web service mais peu importe) et le ExécuteThreadPrincipal)

Merci pour l'info également de l'exemple, j'irai jeter un oeil un de ces quat', y'a certainement des trucs à prendre !
Miembro registrado
37 mensajes
Publicado el 11,enero 2019 - 11:35
Je peux également préciser que chaque procédure utilisée par ExécuteThreadPrincipal, appelle cette fois une procédure du widget pour l'affichage des informations.
Miembro registrado
165 mensajes
Publicado el 11,enero 2019 - 12:14
Pour faire echo à Charly, il y a également eu un exemple à ce sujet au WTT l'an dernier
Les sources sont disponibles : https://www.pcsoft.fr/st/nouveautes-st.html