ProgressWell ou Bar

Salut

J’ai un vnement qui est dcoup en plusieurs taches.
Quand je clique sur le bouton valider, a mouline des donnes dans des BDD, ect…
J’ai essay de d’afficher un progresswell au dbut de la procdure et de l’effacer la fin, mais elle n’apparait pas.
Elle a bien le temps d’apparaitre du fait que le dernier process dure environ 3 secondes.

J’ai essay de faire un progressbar, mais alors l!!!
Suivant mes essais:

  • Rien ne bouge ou ne s’affiche.
  • Ou alors a s’affiche un fois fini avec une valeur 0
  • Ou au dbut, mais elle ne vie pas.

A chaque tape des taches effectues, j’ai initi un valeur de la progressbar
J’utilise un timer pour visiblement rafraichir les valeurs.
J’ai mis ma procdure dans un thread.

Dans le bouton valide, j’ai appeler ce thread.

Bah… niet.

C’est curieux comme les gents aiment se compliquer la vie pour n’afficher qu’une pauvre petite barre de progression.

J’ai utilis cette rfrence:
http://documentation.xojo.com/index.php/Thread

Bof!

Je n’ai jamais pu voir un exemple concret autre qu’un exemple qui fasse bouger une valeur de 1 100.
Oui ok, l’exemple montre bien que l’on peut faire bouger une barre de progression avec une boucle d’itration. Mais qu’en est-il de la faire bouger aprs chaque tape d’une procdure?!

Mystre!
Si on trouve la solution, je vais l’encadrer :smiley:

Franck

[quote=234004:@Franck Danard]
J’ai essayé de faire un progressbar, mais alors là!!!
Suivant mes essais:

  • Rien ne bouge ou ne s’affiche.
  • Ou alors ça s’affiche un fois fini avec une valeur à 0
  • Ou au début, mais elle ne vie pas. [/quote]

Tout cela me fait penser que les changements de valeur sont faits à l’intérieur du même event.

Tant qu’un event n’est pas fini, la barre ne sera pas mise à jour. Et le timer ne se déclenchera pas.

Pour que cela fonctionne, il faut mettre les longues opérations dans l’évènement Run d’un Thread et là où se trouvait ce code aupravant, mettre Thread1.Run (ou autre nom pour le thread).

Ensuite, depuis l’évènement Run, on peut appeller un timer pour mettre à jour la ProgressBar.

En fait, J’avais mis le traitement de mes donnes dans le run (ce qui me paraissait logique un traitement en tache de fond.) Sauf que mon traitement ne se faisait pas.
Bon ok pour l’ide de mettre mon traitement dans le thread.
je vais refaire le test pour appliquer le traitement dans le thread sans affichage de la progressbar,
Une fois que ce soucis sera lucid, je pourrais me concentrer sur l’affichage de la progressbar.

Merci pour ces explications.

Dans l’vnement de mon bouton (enfin, image) MouseDown
J’ai coll ceci et rien d’autre que :

barre.Value = 0 barre.Maximum=13 Timer1.Mode = Timer.ModeMultiple Thread1.Run

Dans mon thread1 sur l’vnement Run j’ai mis mon traitement de donnes (change BDD) avec de temps en temps le changement de valeur:

[code] barre.Visible = True
Session.val_progression = 0

While ticks < waitUntil
Wend
Action 1
Session.val_progression = Session.val_progression + 1
While ticks < waitUntil
Wend

Action 2
Session.val_progression = Session.val_progression + 1
While ticks < waitUntil
Wend

Action 2
Session.val_progression = Session.val_progression + 1
While ticks < waitUntil
Wend
etc
[/code]

Aprs.

Dans l’vnement open de Timer1 j’ai mis ceci :

If barre.Value >= barre.Maximum then // tests the ProgressBar value barre.Value = barre.Maximum Me.Mode = Timer.ModeOff // turns off the checking/updating Else //if not maximum // updates the interface with the current value that was updated by the thread barre.Value = Session.val_progression End If

J’ai bien l’affichage de ma barre de progression (Ordre barre.visible = true oblige dans thread1.run) , mais elle ne bouge pas ainsi que mon traitement des donnes saisies.

Dois-je attirer le litre de Sky et les anti-dpresseurs? :smiley:

[quote=234048:@Franck Danard]If barre.Value >= barre.Maximum then // tests the ProgressBar value
barre.Value = barre.Maximum
Me.Mode = Timer.ModeOff // turns off the checking/updating
Else //if not maximum
// updates the interface with the current value that was updated by the thread
barre.Value = Session.val_progression
End If[/quote]

Cela doit aller dans l’event Action du timer qui doit être multiple, avec une période d’environ 40.

Il est bien multiple.
Je l’avais mis dans Action aussi, mais rien.

Je vais essayer de nouveau ce soir.

En relisant le code, j’ai un gros doute :

While ticks < waitUntil Wend

Ceci pourrait tre une boucle infinie. Je ne vois nulle part l’initialisation de waitUntil. As-tu vrifi que le code dans Run s’excute correctement ?

Pour temporiser, il vaudrait mieux utiliser Thread.Sleep(). Ou alors, faire quelque chose dans ce genre pour viter le mouvement perptuel :

dim deja as double = ticks While ticks < deja + 60 // one second Wend

En haut du code il y a :

Dim waitUntil As Integer = Ticks + 15

La diffrence avec toi c’est que c’est une variable entire et non double.

Sinon, non, le contenu de run ne s’excute pas entirement.
Certainement d effectivement des itrations infinies .

Je te tiens au courant.

Merci en tout cas

[quote=234129:@Franck Danard]En haut du code il y a çà:

Dim waitUntil As Integer = Ticks + 15

La différence avec toi c’est que c’est une variable entière et non double.

Sinon, non, le contenu de run ne s’exécute pas entièrement.
Certainement dû effectivement à des itérations infinies .

Je te tiens au courant.

Merci en tout cas[/quote]

Attend. Tu ne peux pas initialiser waitUntil en haut du code pour toutes les boucles. Il faut le faire immédiatement avant chaque while/wend. Sinon tu n’atteind cette condition que dans la première boucle, et la deuxième ne s’arrète jamais.

Bah c’tait dans l’exemple du site Xojo. :slight_smile:

Ceci expliquerait beaucoup de chose.

Je corrige et je te fais un retour.

Pas mieux:
Mon dbut de code est celui-ci:

[code] System.Log(System.LogLevelInformation,“Validation demande”)

Dim Leticom_db As New MySQLCommunityServer
Dim row as New DatabaseRecord
Dim r as RecordSet
Dim query, id, add_guest, guest_name, free, busy, booking, extension, retour As String
Dim t As New Date
Dim deja as double = ticks

barre.Visible = True
Session.val_progression = 0

deja = ticks
While ticks < deja +15
Wend

// Connexion la base de donnes

System.Log(System.LogLevelInformation,“Connexion la base de donnes”)

[/code]

Dans mon fichier messages j’ai ceci.

Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: Ouverture de l'application Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: Ouverture du fichier leticom.conf Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: Initialisation des champs : date dpart / arrive Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: format de date slectionn : dd/mm/yy Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: format de date slectionn : dd/mm/yy Dec 7 18:11:04 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: Chargement de la configuration. Dec 7 18:11:10 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[15573]: Validation demande

L’information Connexion la base de donnes ,n’apparait pas. Ce qui veut dire que s’arrte avant.
Et pourtant, je pense avoir fait comme tu m’as dit de faire.

Bon en fait, si je supprime toutes les boucles while/wend , a bloque quand mme. :frowning:

Il doit y avoir un bug quelque part si tant est qu’en appelant un thread1.run n’empche pas un code de tourner qui qu’il contienne!!.

Pour info, la webapp tourne sous Centos 7.0 64bits

Donc le problème n’est pas la ProgressBar.

A présent, il faut parsemer le code in Run avec des System.Debuglog et voir exactement où ça coince.

Code:

[code] System.Log(System.LogLevelInformation,“Validation demande”)

Dim Leticom_db As New MySQLCommunityServer
System.Log(System.LogLevelInformation,“Dim Leticom_db As New MySQLCommunityServer”)
Dim row as New DatabaseRecord
System.Log(System.LogLevelInformation,“Dim row as New DatabaseRecord”)
Dim r as RecordSet
System.Log(System.LogLevelInformation,“Dim r as RecordSet”)
Dim query, id, add_guest, guest_name, free, busy, booking, extension, retour As String
System.Log(System.LogLevelInformation,“Dim query, id, add_guest, guest_name, free, busy, booking, extension, retour As String”)
Dim t As New Date
System.Log(System.LogLevelInformation,“Dim t As New Date”)
// Dim deja as double = ticks

barre.Visible = True
System.Log(System.LogLevelInformation,“barre.Visible = True”)
Session.val_progression = 0
System.Log(System.LogLevelInformation,“Session.val_progression = 0”)[/code]

Traces:

Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Validation demande Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Dim Leticom_db As New MySQLCommunityServer Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Dim row as New DatabaseRecord Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Dim r as RecordSet Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Dim query, id, add_guest, guest_name, free, busy, booking, extension, retour As String Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: Dim t As New Date Dec 8 06:20:42 localhost /var/www/cgi-bin/LetiCom/checkin/leti_checkin[31187]: barre.Visible = True

Il s’arrte ici:
Session.val_progression = 0

J’ai remplac Session.val_progression = 0 par barre.value=0
a bloque visiblement chaque initiation d’une variable dans Session
Serait-ce interdit de le faire ?
Parce que j’en utilise dans cette partie de code!
a va tre chaud si je ne peux pas utiliser !

Pas de problme avec les proprits de session. Bien sr qu’on peut, et mme qu’on doit s’en servir.

Session.val_progression = 0 n’apparat pas dans les messages ?

Oui, je l’ai remplac par barre.value=0
Du coup a bloque :
Session.val_progression = Session.val_progression +1

J’ai du mal comprendre pourquoi a bloquerait sur de simples assignations de valeur.

Que se passe-t-il sans les valeurs de progressbar ?

Je souponne que le problme ne soit pas dans la progressbar et les variables qui la pilotent, mais tout bonnement dans les processus de base de donne.

Un projet plus simple, sans la progressBar, aiderait peut-tre mieux comprendre o le problme se situe. Peut tre en ajoutant doucement, ligne aprs ligne, chaque appel important, et en vrifiant que tout va bien, juqu’ rencontrer le pb.

J’ai un collgue qui m’a dit que avec un Thread on ne peut pas forcment faire ce que l’on veut.
Il voulait faire un truc du genre:
Rcolter des donnes saisies
Les envoyer dans un thread ou librer l’utilisateur d’un temps d’attentes de traitement.
Mais a se rvle visiblement pas faisable priori.

D’un autre ct, je ne suis pas press de cette barre de progression dans un premier temps.
Je suis en train de migrer mot appli HTML/PHP/MySQL en Xojo.
Ce que je souhaite c’est recrer les fonctions identiques, puis apporter des amliorations.
Je n’en suis qu’ 2 modules pour l’instant sur 16.
Comme je le fait durant mon temps libre, j’ai le temps. :slight_smile:

Mais bon c’tait l’occasion.
Ds que j’aurais le temps, j’essayerais de faire quelques tests avec un petit projet From Scratch et d’y aller step by step.

J’ai vu aussi que dans les Feedbacks il y avait un tas de problmes diverses z varis :wink:
Doute ou pas… je ne sais pas.

En tout cas merci de ton aide, qui m’a servi tout de mme comprendre le fonctionnement d’une barre de progr.
Malgr hlas, une documentation trs pauvre de Xojo.

Franck

[quote=234465:@Franck Danard]Récolter des données saisies
Les envoyer dans un thread ou libérer l’utilisateur d’un temps d’attentes de traitement.
Mais ça se révèle visiblement pas faisable à priori.[/quote]

Je ne sais pas qui est ce bonhomme, mais un thread est précisément ce que l’on utilise dans ces cas là…