PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Thread agit sur l'affichage
Thread agit sur l'affichage
Débuté par Monsieur AURAY-LORIVAL, 24 avr. 2017 20:41 - 6 réponses
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 24 avril 2017 - 20:41
Bonjour, j’exécute depuis un timerSys actuellement une procédure qui actualise une zone répétée toutes les minutes dans mon thread principal.
J'aimerai mettre cette procédure dans un thread à part car quand elle se fait, ça ralentit voir bloque l'application quelques secondes.
Problème, la procédure agissant sur l'interface à un moment, si je la met dans un thread à part, j'ai une erreur qui me dit que je peux pas modifier l'affichage depuis un thread secondaire. Comment faire ?

Merci à vous
Membre enregistré
72 messages
Popularité : +10 (10 votes)
Posté le 25 avril 2017 - 00:48
Il faut que tu fasse tout tes calculs / requête dans ton thread via la fonction ThreadExecute()

AUSSITÔT que tu doit toucher à l'affichage (exemple raffraichir ta ZR) tu appelle ta procédure d'affichage avec ExecuteThreadPrincipal() à l'intérieur de ta procédure qui est exécute dans ton Thread.

Alors l'interface va être "bloquer" seulement le laps de temps que ta ZR va s'afficher (une fraction de seconde) et non pendant le calcul.
Membre enregistré
64 messages
Popularité : -1 (1 vote)
Posté le 26 avril 2017 - 10:18
Merci beaucoup à toi je n'y avais pas pensé c'est beaucoup plus rapide merci.
Par contre j'ai ouvert un nouveau sujet parce sue maintenant j'ai un bug d'affichage de la zone repetée, au bout de quelques zonerepeteeajouteligne, ce qui est affiché dans les colonnes ne correspond plus au contenu qu'il y'a dans les colonnes.
Membre enregistré
72 messages
Popularité : +10 (10 votes)
Posté le 26 avril 2017 - 13:39
Les threads sont très amusant car ils s'executent tous en même temps alors on ne sait pas trop ce qu'il font et dans qu'elle ordre. à ce que je comprend tu pars un thread pour chaque ligne de ta ZR. Fait bien attention au
SectionCritiqueDébut(MaVariable)
et
SectionCritiqueFin(MaVariable)
sinon 2 threads accède à la même variable en même. Le thread # 18 peut accéder à la variable avant le #12 par exemple. Ce qui fait que c'est pas la bonne données qui s'affiche. Si tu exécute une requête, tu dois aussi l'encercler dans une SectionCritique (j'ai eu des plantages et ca l'a régler mon problème en fesant ca).

Souvent ce que je fais, c'est que j'affiche souvent juste à la fin. Bref, je me créer un tableau et je stock le résultat de mes threads (en fesant bien attention de bien encercler mon tableau avec
SectionCritiqueDébut(MonTab)
TableauAjouteLigne(MonTab, param1, param2, param3)
SectionCritiqueFin(MonTab)
ce qui va empêcher deux thread différent d'écrire dans ton tableau en même temps pour qu'il n'y ai pas de conflits. Et une fois tout les thread terminé, tu affiche ta ZR avec le résultat de ton tableau.

Tu peut aussi le faire avec des taches parallèles, il y a un webinaire qui explique bien le principe. Les taches parallèles sont en quelque sorte des thread, mais je trouve qu'il sont plus facile à gérer quand il faut s'assurer qu'il soit fini pour pouvoir continuer. Par contre tu à aussi besoin de gérer les SectionCritique().
J'utilise les threads plus souvent quand j'ai un calcul à faire qui, soit, n'affecte rien d'autre ou plusieurs calcul totalement différent doivent être exécuter en même temps pour accélérer l'affichage, exemple le calcul des Widget d'un tableau de bord, soit, pour faire un calcul que je veux faire en tache de fond exemple au 30 secondes pour avoir le résultat toujours stocker et y avoir accès tout de suite au besoin.

Fait aussi attention, de bien évaluer tout les risques potentiel d'erreur. Windev en mode test semble arrêter tout les threads lancer par lui-même. Par contre, une fois l'application installer, les threads "semble" être gérer par windows (ou le processeur directement) et si ton application plante pendant qu'un thread s'exécute, il peut faire planter ton PC et tu doit faire un redémarrage. J'ai eu des problème avec ca. Et ah oui... FinProgramme() n'arrête pas les thread en cours et fait planter le PC selon mon expérience :P (quand je dit planter, c'est des lenteurs anormales ou affichage anormal des fenêtre de windows sans rien dedans, etc...)

J'espère de t'avoir aider un peu et bonne chance dans le monde merveilleux des threads :)
Posté le 07 août 2020 - 10:04
Bonjour
J'ai un petit souci avec mon appli Android développée avec windev mobile.
Le souci est que j'arrive à remplir ma zone répétée par programmation, sachant que les données sont dans le cloud, le remplissage de la zr prend beaucoup de temps et ça bloque l'application pendant 1min parfois voir plus.
Je veux bien parallèliser le traitement de remplissage mais je ne sais pas comment faire.
J'ai besoin de votre aide
Voici mon code
Zr_Article.AjouteLigne(Article.Description, Article.Photo)
FenPreint.

Merci de me répondre
Membre enregistré
3 311 messages
Popularité : +93 (137 votes)
Posté le 07 août 2020 - 11:26
Aldy a écrit :
Bonjour
J'ai un petit souci avec mon appli Android développée avec windev mobile.
Le souci est que j'arrive à remplir ma zone répétée par programmation, sachant que les données sont dans le cloud, le remplissage de la zr prend beaucoup de temps et ça bloque l'application pendant 1min parfois voir plus.
Je veux bien parallèliser le traitement de remplissage mais je ne sais pas comment faire.
J'ai besoin de votre aide
Voici mon code
Zr_Article.AjouteLigne(Article.Description, Article.Photo)
FenPreint.

Merci de me répondre


La photo dois être réduite avant d'être télécharger en base 64
Tu peux t'inspirer de l'exemple LST n°85 : Android AppBox qui charge des images et du texte dans une zr
Posté le 07 août 2020 - 12:44
Et pour charger la zr en tâche parallèle, comment procéder ?
J'ai regardé la doc pcsoft mais je ne retrouves pas.
Précision : je travaille sous windev mobile 23