Techniques progressBar sans mettre le traitement principal dans un Thread

Bonjour,
Je programme avec Xojo de manire intermittente et essaye en ce moment de mettre jour un programme (AmplifX) que j’ai commenc dvelopper il y a 15 ans !
Du coup chaque fois je me heurte de nouvelles volutions qui m’obligent reprendre pas mal de trucs.

En l’occurence il s’agit de la mise jour de l’interface (barre de progression et labels) pour permettre de voir la progression de taches lourdes.
Dans ma prcdente version (Xojo 2014 !) lors de l’excution d’une tache (mthode ou event appelant ventuellement d’autres mthodes avec pleins de boucles dans tous les sens), j’avais cr une fentre de progression que je faisais apparaitre et qui se redessinait lorsque je lui demandais depuis les diffrentes mthodes de la tache de calcul.
Ca marchait meme sous Cocoa mais ca ne marche plus maintenant !
J’ai bien vu ce qui est recommand : tache principale dans un thread qui met jour une proprit globale d’avancement de la tache, et mise jour de l’interface (progresserBar ou autre) par une timer.
Mais comme mon programme effectue beaucoup de taches diffrentes, cela ne me semble pas raisonnable de toutes les mettre dans des threads (car ca va tre super compliqu faire, y compris avec AddHandler et va poser des problmes complexes de vrif de fin de tache, voire meme de diminution de performances meme en mettant une valeur leve priority, il me semble)
Bref, est-ce que quelqu’un a une autre astuce ou on ne peut dfinitivement pas faire autrement.
Autrement dit, est-ce que le main thread ne peut pas laisser la main un thread secondaire de faible priorit qui pourrait lui s’occuper de la mise jour de l’UI (par le biais d’un timer peut tre); J’ai fait pleins d’essai dans ce sens mais rien ne marche (le timer ne “fire” pas) mais peut tre j’ai loup une possibilit.
J’espre avoir t assez clair :frowning:
Nicolas

Salut Nicolas,

les mises–jour de l’UI ne peuvent plus se faire depuis un Thread autre que le main Thread. Donc un Thread secondaire ne te servira rien.

mon avis, le mieux pour toi serait de :
Adopter partiellement les recommandations (mettre–jour une variable globale et utiliser un Timer (qui est toujours excut dans le Main Thread) pour rpercuter les changements dans l’UI)
Utiliser App.DoEvents des endroits clef de ton code pour permettre au Timer de s’excuter

Ce n’est pas l’idal, mais a devrait fonctionner.

Bonjour Stphane
et merci pour ta rponse.

J’ai pas trop regard le DoEvent car sur le forum (en englishe) de nombreux contributeurs dconseillent fortement de l’utiliser.
Par exemple :

Mais bon s’il n’y que ca faire, je vais regarder…

Encore merci.

je n’utiliserait pas le doevent non plus … enlever des que possible et rempalcer par un timer.

Je suis d’accord avec Kem mais je t’ai propos cette solution parce que tu as clairement indiqu que tu ne souhaitais pas mettre tout ton code dans un Thread. Or c’est soit a, soit utiliser App.DoEvents.

Si tu veux aller vite, App.DoEvents est facile mettre en uvre, mais un jour ou l’autre, il faudra probablement modifier ton logiciel de faon plus drastique et en venir aux Threads.

Merci tous les deux.
Du coup est-ce que tout le monde dans la communaut a t oblig de re-crire de grosses parties de programmes ?
C’est quand meme fou, je trouve, de devoir affronter de tels changements.
Le pire tant qu’en plus dans les Threads “secondaires” (je les appelle comme ca par opposition au “Main thread”, mais je sais pas si c’est ncessaire) on ne peut pas du tout interagir avec l’interface. Mais en programmation objet beaucoup d’lments font partie de l’interface y compris par exemple pour moi des objets ayant pour vocation de rentrer dans les diffrents calculs.
Bientt ca va tre plus facile de faire de l’Objective C ou Swift si ca continue :frowning:

Eh bien, ma connaissance, ce n’est pas Xojo qui a requis ce genre de changement mais bel et bien les systmes d’exploitation qui ont impos a, mais pour de bonnes raisons.

Donc il a bien fallu s’y faire

Oui oui j’avais compris (un peu tard :wink: ) que c’est les version 64 bits des OS qui imposent ca pour pleins de raisons valables probablement. Mais c’est juste que du coup, je vois plus comment on peut faire du RAD dans ces conditions.

Je viens d’essayer DoEvent. Ca fait “la job”. Mais meme sur un essai tout simple je vois dj les problmes venir : ralentissements trs notable des calculs et risque que l’utilisateur aille activer un menu ou cliquer sur un bouton

Avec tes calculs dans un Thread diffrent, la vitesse va s’amliorer. En revanche, l’utilisateur va toujours pouvoir faire des choses que tu ne souhaites pas en tant que dveloppeur (mais qui te sembleraient normales en tant qu’utilisateur).

Tu peux toujours essayer de dire tes utilisateurs que “il ne faut pas bouger la souris aprs avoir cliqu sur ‘OK’”… mais qui va vraiment le faire ? Et qui ne va pas se plaindre ?

Pour rsoudre le problme, il faut afficher une fentre modale pendant la dure du traitement

va voir la documentation sur Thread tout est expliquer comment faire

Je pense que c’est le problme des DoEvents, de relancer une seconde fois la mme tche (la mme procdure). Il y en aurait 2 (ou plus) de lancer en mme temps qui pourraient modifier les mmes variables globales.

Avant j’avais des DoEvents mais je bloquais toute l’interface, sauf les menus/boutons qui permettaient de stopper le process en cours. M’tant retrouv au chmage, j’ai tout modifi mes 11 programmes pour tout mettre dans des Threads ou des Timers. Mais pfff a a t du boulot.

Les Timers sont une autre solution. De temps en tant tu sors de la boucle (qui est dans le Timer) en mmorisant o tu en es. L l’UI reprend la main, puis tu relances ton Timer aprs un court temps (donc ta boucle reprend l o tu l’as laisse).
L’avantage de la mthode du Timer c’est que tu peux lire et crire dans ton interface (TextField, ProgressBar etc.). Alors que dans un Thread tu dois passer par des variables.

J’ai un seul ModalAttenteProgress… dans ma webpage je me cre autant d’objet que j’ai besoin de process avec comme rfrence ModalAttenteProgress… et je nomme ces objets significatifs… Dans le script au point progress j’y insre “objmonscript.show” et tout le script qui suit est mis dans mon event “action” de mon objet “objmonscript”… et ca fonctionne toujours trs bien.

As-tu essay le module Task ? une subclass du Thread qui implmente un UpdateUI dans ses vnement. https://www.dropbox.com/sh/3tiom71xip6ch51/AAAexsX3cXloCt5c4ESRhzZUa?dl=0