Problème sur la table de multiplication en vb.net

Daganyigite Messages postés 1 Date d'inscription vendredi 17 mars 2023 Statut Membre Dernière intervention 17 mars 2023 - 17 mars 2023 à 00:55
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 - 22 mars 2023 à 17:51

Bonsoir j'ai crée un tableau contenant des boutons clicquables de la multiplication mais le problème est que je doit afficher le résultat seconde par seconde dans le tableau mais quand je fais l'opération s'affiche en un coup sans me montrer la multiplication seconde par seconde je sollicite votre aide.

8 réponses

Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
22 mars 2023 à 08:41

Tout d'abord, je t'invite à lire la conclusion de cet article https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net#conclusion et d'appliquer les préconisations qui y sont faites pour coder plus proprement.


Ton code s'éloigne de la question initiale dans le sens où il était question de cadencement, 

afficher le résultat seconde par seconde dans le tableau 

Au passage, tableau ça fait plus penser à un datagridview ou une listeview qu'à un textbox.


Pour ton cas, l'affectation du texte se fait bien au fur et à mesure de la progression des boucles, car ton code est écrit dans le thread principal, mais

  • A chaque itération, tu écrases le texte précédent 
  • Il y a une fonction qui fige le rafraîchissement d'une page pendant l'exécution d'instructions dites bloquantes (les boucles par exemple). La preuve c'est que tu ne peux pas déplacer le formulaire.

Ce n'est donc pas que ton textbox n'est pas mis à jour, mais c'est bien l'ensemble du formulaire qui est bloqué

En introduisant le Refresh, en fait tu rends la main à windows pour un temps indéterminé et tu demandes le rafraîchissement de la page. Si windows prends la main suffisamment longtemps, tu as le temps d'apercevoir les changements.

L'idée de base est d'utiliser un thread à part qui fait le calcul et demande ensuite au thread principal d'afficher le résultat, puis fait une petite pause avant le calcul suivant.

Dans ton cas, comme dans celui de Daganyigite, un timer ferait très bien l'affaire.

C'est un thread à part qui fait une pause le temps d'un intervalle que tu définis et qui via un événement rend la main au thread principal pour faire ses calculs et afficher les résultats.

Tu peux aussi utiliser un backgroundworker, qui est un thread déjà outillé pour envoyer une progression au thread principal et un résultat à la fin.

Sinon tu peux gérer à partir de thread de base et choisir parmi 3 ou 4 façons "threadsafe" de faire mettre à jour le textbox.

Mais quoiqu'il en soit, il faut introduire du retard sinon tu ne verras rien, tes yeux et ton cerveau ne traitent pas l'information assez vite.


1
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
Modifié le 17 mars 2023 à 08:18

Bonjour 

[mode blague lourde on] dans ma boule de cristal, je vois qu'il manque une pinte à la ligne 1664 [mode blague lourde off]

Comment veux tu qu'on réponde à ça, sans aucun éléments?

On n'est pas dans ta tête, on n'a pas accès à ton ordinateur.

Ce que tu dis avoir fait, j'imagine au moins 5 ou 6 façons de le faire en WPF (plus toutes celles auxquelles j'ai,pas pensé).

Mais, je doute que tu codes en WPF, probablement en Winform, peut-être en UIapp, ou en ASP.

Donc avec les 4 technos d'IHMn on a déjà entre 30 et 40 façons différentes.

En gros tu nous laisses trois choix

  1. te demander des éléments, ce que je fais, il faut que tu nous dises quelle techno et que tu poste le code qui calcule la table de multiplication. Pour poster ton code, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
  2. choisir une façon et répondre arbitrairement facile, tu fais une animation avec un dispatcher timer et tu bindes ta classe sur un label ou un textbloc, Ça t'aide, j'en suis persuadé 
  3. ne pas répondre 

0
Sam_Placi Messages postés 38 Date d'inscription mercredi 29 juin 2022 Statut Membre Dernière intervention 22 mai 2023 1
Modifié le 22 mars 2023 à 21:15

Bonjour,

Bien sûr Whismeril à raison, sans davantage d'infos, personne ne peut t'aider.

Toutefois, je te communique tout de même un détail qui me revient en mémoire :

J'image que ton affichage du résultat seconde par seconde est demandé par un TextBox1.Text = LaValeurSoiuhaitée. (je suppose ici que le TextBox est nommé TextBox1).

J'imagine encore que ce code d'affectation du TextBox est à l'intérieur d'une boucle.

Et là, je me souviens que l'affcihage à jour du TextBox ne vient qu'une fois la boucle terminée. Pour avoir l'affichage du TextBox à jour à chaque tour de boucle, fais suivre la ligne d'affectation du TextBox d'un TextBox1.Refresh.

LeTextBoxAAffecter.Text = LeResultatDuCalcul
LeTextBoxAAffecter.Refresh

J'espère que ceci te dépannera.

Bonne journée,

Sam

0
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
21 mars 2023 à 12:23

Bonjour Sam.

donc tu choisis de répondre arbitrairement.

T'es tu demandé si les textbox de WPF, UI ou ASP ont une méthode Refresh?

D'ailleurs est ce affiché dans une textbox ?

0
Sam_Placi Messages postés 38 Date d'inscription mercredi 29 juin 2022 Statut Membre Dernière intervention 22 mai 2023 1
21 mars 2023 à 13:43

Ben oui Whismeril ...

D'une part, je n'ai pas vu qu'il ne s'agissait pas de Windows Forms, je ne serais pas intervenu.

Pour le reste, comme tu peux le lire, j'utilise à deux reprises de l'expression "J'imagine ...". Cela signifie bien que j'émet des suppositions. C'est seulement dans le cas où elles se vérifient que ma solution peut être pertinente. Et je suppose, une fois de plus, que Daganyigite se rendra vite compte s'il peut lui est utile de réfléchir à ma réponse ou pas.

Je crois que les idées lancées ne sont jamais très mauvaises, quand elles ne servent pas directement le problème posé, elles peuvent aider d'autres lecteurs qui viendraient ici , sans se rendre compte (comme moi) qu'il ne s'agit pas de Windows Forms.

Question : dans l'énoncé du problème, quel détail indique qu'il ne s'agit pas de Windows Forms ?

Merci d'avance pour ta réponse.

Bon après-midi,

Sam

0
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
21 mars 2023 à 16:48

Il n'y a rien qui l'indique, mais il n'y a rien qui ne l'indique pas non plus.

C'est pour ça que dans mon petit 1, parmi les éléments à fournir, il y a la techno d'IHM.

0
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656 > Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024
21 mars 2023 à 16:50

Et si en 4 jours, il n'a pas répondu, c'est soit qu'il a trouvé par ailleurs et s'en fout de ce sujet (et donc  ne mérite pas qu'on s'y attarde).

Soit qu'il trouve offusquant, qu'on ne soit pas devin, et ne mérite pas plus qu'on s'y attarde.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sam_Placi Messages postés 38 Date d'inscription mercredi 29 juin 2022 Statut Membre Dernière intervention 22 mai 2023 1
21 mars 2023 à 17:31

Ok, il est sans doute passé à autre chose ...

Mais, comme je le disais, ma réponse pourrait être utile à quelqu'un d'autre, c'est vrai que j'ai rencontré ce problème en WinForm et que le Refresh m'a servi.

Et puis si ça ne sert à personne, tant pis  ...

Très bonne soirée,

Sam

0
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
21 mars 2023 à 17:53

En plus, Refresh fait appel à un DoEvents, il me semble, et ça n'est pas vraiment conseillé.

Il y a de multiples autres façons de faire, plus "réglementaires"


0
Sam_Placi Messages postés 38 Date d'inscription mercredi 29 juin 2022 Statut Membre Dernière intervention 22 mai 2023 1
Modifié le 22 mars 2023 à 21:14

Bonjour Whismeril,

... Il y a de multiples autres façons de faire, plus "réglementaires"

Ton dernier commentaire m'interpelle car je ne vois pas comment ...

Si tu peux me donner une solution à la portée du "débutant" que je suis, je prends.

J'ai récrit un bout de code (en WinForm :D)))) semblable à celui qui m'avait posé problème :

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim R As Long = 0
        TextBox1.Clear()
        For i As Integer = 0 To 10
            For t As Integer = 0 To 50000000
                R += i + t
            Next t
            TextBox1.Text = R
            TextBox1.Refresh()
        Next i
    End Sub

Bien sûr, le problème se situe au niveau de la mise à jour du TextBox, tel quel cela est très rapide mais sans la ligne du Refresh, mise à jour du texte n'a lieu avant la fin de la boucle i.

Merci d'avance.

Sam

0
Sam_Placi Messages postés 38 Date d'inscription mercredi 29 juin 2022 Statut Membre Dernière intervention 22 mai 2023 1
22 mars 2023 à 09:37

Merci pour ta réponse Whismeril.

J'ai parcouru l'article dont tu m'as transmis le lien. C'est intéressant, je vais le relire posément.

Pour ce qui est d'utiliser le Timer pour organiser un cadencement, ça me dit, j'ai déjà souvent utilisé le Timer.

Par contre, lorsqu'il est question de programmation multithreads, de même que de programmation asynchrone, ça devient difficile. J'ai déjà approché ces techniques, parfois même utilisé, mais toujours avec beaucoup de difficultés et sans une réelle compréhension. 

Je crois pouvoir conclure que dans le cas de ma boucle, le Refresh du TextBox n'est pas la plus mauvaise solution compte tenu de mes limites en programmation.

Encore merci de m'avoir consacré un peu de temps.

Très bonne journée,

Sam

0
Whismeril Messages postés 19048 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 mai 2024 656
22 mars 2023 à 17:51

Je crois pouvoir conclure que dans le cas de ma boucle, le Refresh du TextBox n'est pas la plus mauvaise solution compte tenu de mes limites en programmation.

Si tu te satisfais d'une pratique bon recommandée.

0
Rejoignez-nous