|
FOROS PROFESIONALES WINDEV, WEBDEV y WINDEV Mobile |
| | | | | |
| 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 - #LaPiraterieNestJamaisFinieMensaje 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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|