Application lente

Signaler
-
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
-
Bonjour,
j'utilise dans mon programme un morceau de code source pour remplacer (jamais la même chose) un texte précis par un des éléments d'une listbox.

For a = 1 To Len(MONTEXTE)
Trouver = InStr(MONTEXTE.Text, "#fruits#")
If Trouver <> 0 Then
MONTEXTE.SetFocus
MONTEXTE.SelStart = Trouver - 1
MONTEXTE.SelLength = Len("#fruits#")
MONTEXTE.SelText = liste_fruits.List(nombre_fruits * Rnd + 1)
Else
End If
next a

Malheuresement, le contenu de MONTEXTE est égale à environ 350-500 caractères et donc l'application met énormément de temps à générer les listes de fruits et si par exemple je demande à l'application de modifier quelque chose sur l'application le résultat n'est pas possible.

Je recherche si vous avez, un moyen plus simple pour faire la même chose et si cela n'est pas possible un moyen simple pour que l'application tourne plus vite.

Merci d'avance pour l'aide que j'espère vous allez m'apporter.

12 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
utilise la fonction replace
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Evidemment que c'est long, tu fais autant de boucle que tu as de caractères dans ton texte.
Il n'y a aucun interet à faire ça.

Ce code devrai déjà te réduire signifiquement le temps d'éxecution

a =  1 
While a <  Len (MONTEXTE.Text) 
    Trouver  = InStr(a, MONTEXTE.Text, "#fruits#") 
    If Trouver <> 0 Then 
        MONTEXTE.SetFocus 
        MONTEXTE.SelStart =  Trouver - 1 
        MONTEXTE.SelLength =  Len ("#fruits#") 
        MONTEXTE.SelText  = liste_fruits.List(nombre_fruits * Rnd + 1) 
        a =  Trouver 
    Else 
        a =  Len (MONTEXTE.Text) 
    End If 
Wend 

<small>Coloration syntaxique
automatique</small>

---- Sevyc64  (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Je le répète : la fonction replace est faite pour cà, ca évitera de jouer avec la sélection du texte, ce qui sera d'autant plus rapide !
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Dark, la fonction Replace remplace toutes les occurences du texte par la même chaine en une seule passe.

Si tu regarde bien son code, chaque occurence est remplacée par une chaine prise aléatoirement dans un tableau.
Dans ce cas là, je doute que la fonction Replace corresponde à ce qu'il recherche.

Cependant, je suis largement d'accord avec toi, pour tout remplacer, il 'ny aurait pas plus rapide que Replace.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #

La fonction replace ne fonctionne pas totalement comme je le veut vu que je veut que le texte qui va être remplacé ne sois jamais la même chose.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Okay, autant pour moi alors, j'avais pas fait gâffe au remplacement de texte aléatoire, et pourquoi pas la fonction split :
On fait un split de tout le texte.

Pour chaque ligne du tableau obtenu tu rajoute un élément aléatoire à la fin du tableau. Et enfin, tu rejoint tout le tableau en une seule ligne comme auparavant... là encore, ca t'évite de passer par les sélections de texte dans ton textbox, ce qui n'est pas négligeable.
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonjour tout le monde,
^^casy, ton code semble correct  à ceci près qu' il ne doit continuer
que sur ce qui reste de MONTEXTE.Text.
Trouver = InStr(a, Mid(MONTEXTE.Text,a,Len(MONTEXTE.Text)-a), "#fruits#")
En plus , il ne doit pas y avoir de :
 
Else  

  a  = 
Len
(MONTEXTE.Text) 

End If

Il ne doit pas forcer le compteur,
car ça le fait sortir de Do While alors qu' il doit poursuivre
jusqu' à la fin du Texte.

chaibat
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
je crois que moi aussi je n' ai qu' à moitié raison !
Je retire ce que j' ai dit sur Else....a = Len(MONTEXTE.Text) 

(Else s' il n' a pas trouvé tout le long du texte).
Tu as raison sur ce point.
Mais je maintiens le reste .
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Même la première partie, tu peux la retirer.

Trouver =   InStr (a, MONTEXTE.Text, "#fruits#") permet de faire la recherche seulement à partir de la dernière position trouvée.
Et ton instruction n'est pas bonne, car tu va faire la recherche à partir de la dernière posistion trouvée mais dans une chaine ou tu auiras enlenvé les caractères déjà analyser. Tu fausse la comparaison. Dans ton cas, il faudrait systèmatiquement faire la recherche depuis 1 et non pas depuis a

Effectivement j'aurais pu, prendre aussi en compte le texte qui viens d'être changé. Mais j'ai jugé arbitairement que ça devait couter beaucoup plus de temps de faire appel à 2/3 opérations (mid, -, len) supplémentaire que d'analyser tout au plus une quinzaine de caractères de trop. C'est pour cela que je ne touche pas à la chaine comparée, j'indique juste le point de départ de la comparaison, qui augmente à chaque occurence trouvée.

C'est donc un compromis que j'ai proposer avec mon code.

---- Sevyc64  (alias Casy) ----<hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Effectivement !
T' as raison sur toute la lignen, casy.
Ce qui m' a induit en erreur c' était le fait que
j' avais compris à ma première lecture que tu sortais
de la boucle une fois une occurence était trouvée.
De là je me suis lancé sur une fausse logique.
Comme quoi il faut tourner sept fois sa plume avant d' écrire (....)


Bonne journée à toi.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Comme quoi il faut tourner sept fois <strike>sa plume avant d' écrire</strike> son clavier avant de tapper

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
tu vois, on parlait justement d' erreur !