ACCÉLÉRATION DE LA VITESSE D'AFFICHAGE EN "GELANT" LE RAFRAÎCHISSEMENT D'UN CONT

cs_MyC Messages postés 94 Date d'inscription lundi 23 septembre 2002 Statut Membre Dernière intervention 22 avril 2003 - 23 déc. 2002 à 10:59
NISANDSYSTEMS Messages postés 146 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 13 décembre 2014 - 13 déc. 2014 à 15:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/5427-acceleration-de-la-vitesse-d-affichage-en-gelant-le-rafraichissement-d-un-controle

NISANDSYSTEMS Messages postés 146 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 13 décembre 2014
13 déc. 2014 à 15:15
Bonjour,

pour eviter le clignotement du controle il suffit juste de supprimer doevents dans les deux procedures tout simplement.

A+
cs_Arcanis Messages postés 18 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 26 juin 2008
22 nov. 2006 à 14:09
Programmix,

Merci de ta réponse. J'ai essayé de mon coté d'utiliser la méthode "cache-cache" sur ton projet. Je passe à 20ms......... En revanche, au lieu d'obtenir un effet de clignotement, j'ai plutôt un effet d'interrupteur (jour/nuit). C'est sans doute dûe à ma machine qui est assez performante (sur mon lieu de travail :-) ).

Je peux en revanche justifier mon choix sur mon projet d'éditeur de texte. Le projet doit permettre une gestion multi-fenêtre à l'interieur de l'appli (avec une fenêtre MDI et des fenêtres filles). Donc lors d'une modification de masse sur un fichier, il est intéressant de voir sur lequel on travaille, surtout quand tous les fichiers sont modifiés les uns après les autres par le même traitement (modif séquentielle de chaque fichier en fait...).
Donc je vais essayé ton api pour essayer de grapiller quelques centièmes...

Je vais également essayé ton projet à plus grande échelle (100 000, 300 000 lignes à remplir) pour voir... Peut être qu'à cette échelle, elle est plus rapide...

Encore merci et a+

Arcanis
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
22 nov. 2006 à 12:24
Arcanis,

Aucune idée...
Il me semble qu'avec la méthode "cache-cache", il y a un effet de clignotement qui peut être désagréable (c'est du moins ce que j'ai pu observer sur mes premiers essais du genre et de vieux pc).

Le mieux serait de faire une copie de ton projet, de remplacer le cache-cache par les API et de comparer.

C'est hélas, tout ce que je peux dire, vu que je ne suis pas un expert en API et que je n'ai plus touché à VB depuis un bon moment.

Bien à toi,

Programmix
cs_Arcanis Messages postés 18 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 26 juin 2008
22 nov. 2006 à 11:47
Salut à tous,

D'abord bravo pour cette source. L'optimisation via les API est toujours bon à prendre !!!
J'aimerais toutefois vous demander conseil. J'ai développé un éditeur de texte en vb qui permet des modifs de masse sur fichier(s), et j'ai fait l'erreur de choisir un objet listview comme zone de reception du fichier.
Après de nombreuses fonctionnalités ajoutées, je me suis rendu compte d'un manque de performances. En effet, à la base le programme devait servir à ouvrir de petits fichiers.
Maintenant, il est utilisé pour des fichiers dépassant les 300 000 lignes...........
Autant dire que ma listview en prend un coup à chaque manipulation. Pour optimiser, j'ai opté pour la méthode "on cache la listview" ce qui permet un énorme gain de puissance.
Toutefois, d'après vous, vaut il mieux utilisé cette api ou ma méthode de "cache-cache" ???

Merci d'avance pour vos réponses...

PS : épargnez moi les conseils du style "utilise plutôt une textbox", c'est impossible. Autant jeter à la poubelle 2 ans de dev... Je DOIS maintenir la listview...

Arcanis
cavo789 Messages postés 168 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 28 juillet 2009 1
29 sept. 2006 à 09:41
Merci pour tout vos conseils.
papipsycho Messages postés 45 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 1 janvier 2008
19 mars 2005 à 03:11
jai oublier

aven modif 210ms
apre modif 32ms
papipsycho Messages postés 45 Date d'inscription samedi 24 mai 2003 Statut Membre Dernière intervention 1 janvier 2008
19 mars 2005 à 03:10
apre modif du code joptien 32 ms !!!!!!

Private Sub Command2_Click()

Dim nStart As Long
Dim n As Integer
Dim i As Integer
nStart = GetTickCount()
ListView1.View = 3
n = 1000
ListView1.ListItems.Clear

For i = 1 To n
ListView1.ListItems.Add , , "Chaîne " & CStr(i)

'-- En validant la région, il n'y aura pas de génération d'un message WM_PAINT
ValidateRect ListView1.hWnd, 0&

'-- "Rafraîchit" la liste
'(=>) Essayez également en désactivant cette ligne...
If (i Mod n) = 0 Then InvalidateRect ListView1.hWnd, 0&, 0&

'-- Autorise le multi-tâche
DoEvents
Next i

InvalidateRect ListView1.hWnd, 0&, 0&
MsgBox Str(GetTickCount() - nStart) & " ms", vbOKOnly, "Avec optimisation :"

End Sub
bab22333 Messages postés 1 Date d'inscription jeudi 23 janvier 2003 Statut Membre Dernière intervention 11 mars 2005
11 mars 2005 à 20:53
je voudrais pas trop critiquer mais meme avec ces api, ça clignote quand meme ... bcq moins, certes, mais c'est pas parfait.

il y a pas moyen d'empecher complément le clignotement ??
cs_Kike Messages postés 13 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 septembre 2005
28 nov. 2003 à 12:36
alors
avec optimisation 310ms
sans optimisation 11600ms
moi 40 ms
On rend la liste invisible au début du remplissage et on la ré affiche en fin.
simple et sans effet clipping
Voici le code (pour les débutants)
rajouter un bouton "command 3 " et le code suivant

Private Sub Command3_Click()

Dim nStart As Long
Dim i As Integer

'Démarre le "chrono"
nStart = GetTickCount()
ListView1.Visible = False
'Pour un affichage de type "Report"
ListView1.View = 3

'Efface la liste
ListView1.ListItems.Clear

'Boucle pour ajouter 1000 éléments
For i = 1 To 1000
ListView1.ListItems.Add , , "Chaîne " & CStr(i)

'-- Rend la main à Windows
DoEvents
Next i
ListView1.Visible = True
MsgBox Str(GetTickCount() - nStart) & " ms", vbOKOnly, "Sans optimisation :"

End Sub
FrostByte Messages postés 138 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 28 janvier 2006
14 sept. 2003 à 11:42
ouais logik, je vais essayer mais geler bcp de controles sa va pas ralentier la becane ? je viens de tester et bah rien à faire !! sous xp sa marche pas !!
FrostByte Messages postés 138 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 28 janvier 2006
14 sept. 2003 à 11:18
ouais logik, je vais essayer mais geler bcp de controles sa va pas ralentier la becane ?
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
14 sept. 2003 à 08:37
Pourquoi ne ferais-tu pas l'expérience puisque, je suppose, que tu as déjà une Form prête à être testée ?
Si cela marche ou nécessite l'une ou l'autre modif, tu pourras nous en faire part...
FrostByte Messages postés 138 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 28 janvier 2006
14 sept. 2003 à 01:10
Je m'explique :
quand un formulaire contient beaucoup de composants, et, que tu dois tous les redimmensionner lors de l'evenement form_resize, tu as un effet (qui se nomme "flickering" je crois) qui fait que les controles clignotent lors du redimensionnement, ma question était peut-on essayer de bloquer cet effet "flickering" avec ta technique de gele grâce à la fonction Freeze et ainsi ne pas utiliser de subterfuge (voir ssubtimer6.dll voir l'exemple de steve mc mahon www.vbaccelerator.com), et donc de pvoir redimmensionner sans cet effet !! si tu as trvé la reponse ou une autre technique mail moi !!
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
13 sept. 2003 à 19:04
Je n'ai jamais testé...
En fait, je ne vois pas très bien ce que tu veux obtenir...
Mais personnellement, je me dis qu'au lieu de geler tous les contrôles de ta Form, tu peux peut-être geler celle-ci...
FrostByte Messages postés 138 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 28 janvier 2006
13 sept. 2003 à 17:55
Vous allez peut-être me rire au nez, mais peut-on geler un ensemble de controle durant le redimenssionement d'un formulaire si oui, pourriez vous m'indiquer la methode !!
cs_babboss Messages postés 121 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 29 novembre 2006
19 août 2003 à 04:16
c super comme source
merci a toi :)
cs_BFR Messages postés 88 Date d'inscription mardi 30 juillet 2002 Statut Membre Dernière intervention 1 mars 2008
21 juil. 2003 à 16:15
Effectivement j'ai déja essayé avec un richtexbox et ça marche
A++
cs_olid Messages postés 296 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 28 janvier 2008
21 juil. 2003 à 12:53
Merzi....tas répondu à la principale ! ;o)

Zetais pô temeraire nan plus pour ezzayer avec d'autres controles (qui ont un evenment paint) !!! :o|

Je pense pouvoir tester avec Picturebox et les menus... je vous dis quoi si jamais zà plante grave l'ordi ! :op
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
21 juil. 2003 à 10:25
>Réponse à olid
- Je pense que l'on peut utiliser les API pour d'autres contrôles que le ListView puisqu'en fait on demande à Windows de "redessiner" ou non le contrôle ;
- En ce qui concerne les arguments, je ne connais pas leur utilité (je rappelle que c'est une astuce qui émane Xavier LECLERCQ) et je ne me suis pas "amusé" à les changer pour voir les conséquences (je ne suis pas du genre téméraire).

Voilà une réponse qui ne répond pas vraiment à tes attentes, mais c'est tout ce que je peux faire...
cs_olid Messages postés 296 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 28 janvier 2008
21 juil. 2003 à 03:45
Heu...une question idiote ?!!!

Les deux API zappliquent que pour les listview ? :o|

Moins idiot... à quoi zert les autres arguments (où tas mis &0) de zes fonctions API ? :o.

Merzi pour la réponse ;op
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
25 juin 2003 à 22:35
Franchement... C'est cool !
V'est le petit truc dégueulasse dans les applis que tout le monde avaient envie de virer ! je vais reprendre ce qu'a dit MyC:
"même si cette source n'est pas de toi" , "c'est une très bonne contribution".

Et en plus ca accélère le code. ^_^

8/10 +1/10 (pour l'originalité ) + 1/10 (Source apparement unique )

donc un piti 10/10

-={[ ZeroCool ]}=-

P.S. : Je kiffe le "Quelle touche.exe" sur ton bureau :D mdr !
cs_BFR Messages postés 88 Date d'inscription mardi 30 juillet 2002 Statut Membre Dernière intervention 1 mars 2008
24 déc. 2002 à 13:56
en reponse:
il fige l'affichage du controle au début de ta procedure
puis le défige à la fin,cette API permet d'ajouter des élements à un EX:listview sans provoquer l'affichage de chaque élément il n'y à pas besoin de boucle il faut le mettre au début de la procédure puis à la fin
est-ce clair ?
A++
cs_Billou Messages postés 34 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 27 août 2007
23 déc. 2002 à 22:10
super ce code mercie 10/10

arrrrrrrrrrrgggggggghhhhhhhh burk burk win 98 :-)))))))) ^^

++
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
23 déc. 2002 à 18:24
Réponse BFR

Je ne sais pas... Je n'ai pas essayé en mettant la fonction en dehors de la boucle...

Est-ce là une autre méthode que tu proposes ??
cs_BFR Messages postés 88 Date d'inscription mardi 30 juillet 2002 Statut Membre Dernière intervention 1 mars 2008
23 déc. 2002 à 17:49
'-FIGER L'AFFICHAGE DU LISTVIEW,TREEVIEW ETC...***************************************
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Public Const WM_SETREDRAW = &HB
'-FIGER L'AFFICHAGE DU LISTVIEW,TREEVIEW***************************************



'-Je désactive l'affichage du contrôle
lRet = SendMessage(ListView1.hwnd, WM_SETREDRAW, False, 0&)

'-J'active l'affichage du contrôle
lRet = SendMessage(ListView1.hwnd, WM_SETREDRAW, True, 0&)
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
23 déc. 2002 à 17:21
La ligne "ValidateRect ListView1.hWnd, 0&" doit se trouver en dehors de la boucle For ! non ?
cs_FPatrick Messages postés 122 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 8 août 2014 1
23 déc. 2002 à 15:27
Bonjour tout d'abord.
Si tu mets la liste ou les controles dans un picturebox et que tu rends invisible ce picturebox lors d'un chargement , la vitesse de chargement et d'affichage est considérablement augmenté (remarqué plusieurs fois dans mes applications) . Par contre on charge un controle donc de la mémoire , a voir ....
Merci d'avance pour tes commentaires....
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
23 déc. 2002 à 12:55
Comme tu as pû le voir, cette API est également utilisée après la boucle et sert à rafraîchir la liste.

La ligne de code peut être traduit de la manière suivante :
If (i Mod 10) = 0 signifie que toutes les 10 boucles...
Then InvalidateRect... on redessine la ListView1
Ainsi et suivant les PC, le clignotement peut encore apparaître mais à une moindre fréquence...

Effectivement, en supprimant cette ligne de code, on accélère encore le temps de réalisation de la boucle puisque qu'on ne la redessine plus (ce qui se faisait 1000/10=100 fois)
cs_MyC Messages postés 94 Date d'inscription lundi 23 septembre 2002 Statut Membre Dernière intervention 22 avril 2003
23 déc. 2002 à 12:35
Peux-tu me dire à quoi sert cette ligne : "If (i Mod 10) = 0 Then InvalidateRect ListView1.hWnd, 0&, 0&", car comme j'ai mis cette ligne en commentaire comme il est suggéré dans le code, et au lieu de 15751 ms, en vue grandes icônes, avec 1000 items, et avec cette ligne, cela se fait en 99 ms avec les mêmes propriétés mais avec la ligne en commentaire et sans le moindre petit clignotement. Alors j'aimerai savoir, si est est obligatoire dans certains cas et sinon à quoi sert-elle ? Merci d'avance pour ta réponse, et encore bravo pour cette source très utile !
cs_MyC Messages postés 94 Date d'inscription lundi 23 septembre 2002 Statut Membre Dernière intervention 22 avril 2003
23 déc. 2002 à 10:59
Je ne sais pas si tu as vu ma question dans le forum ou si tu lis dans mes pensées, mais c'est exactement ce qu'il me fallait. Un grand merci à toi (10/10, même si cette source n'est pas de toi, car c'est une très bonne contribution) !
Rejoignez-nous