Un doevents plus rapide

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 692 fois - Téléchargée 27 fois

Contenu du snippet

Salut à tous!
Ce petit bout de code à mettre dans un module sert à remplacer l'ancien 'DoEvents' par cette petite amélioration beaucoup plus rapide: 'DoEv'.

Source / Exemple :


'Api's

Public Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Public Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long
Public Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long

'Types
Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Type MSG
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

'Constantes
Public Const PM_REMOVE = &H1
Public Const PM_NOYIELD = &H2
Public Const PM_NOREMOVE = &H0

Dim msg_ As MSG 'Declaration de la variable msg_
'Fonction
Sub DoEv()
    Do While PeekMessage(msg_, 0, 0, 0, PM_REMOVE) 'Vide la pile
        TranslateMessage msg_
        DispatchMessage msg_
    Loop
End Sub

' Remarque : Si vous Mettez PM_NOREMOVE Votre systeme reste bloqué pour je ne sais quelle raison. Apparament il ne doit pas vider la pile d'attente

Conclusion :


Voilà j'ai tout dit au début :-)
@++ Flo

A voir également

Ajouter un commentaire

Commentaires

Herge89
Messages postés
1
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 juillet 2006
-
Quand on cherche la performance on code pas en VB :)

Désolé de vous avoir laissé galérer plus de 2 ans pour rien avec ce langage lol.

Bravo quand même à MadLucas pour la clarté de tes explications.
jockos
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2 -
La version en C++ pour ceux que ça interresse...
http://www.cppfrance.com/code.aspx?ID=9878
gandalfkhorne
Messages postés
70
Date d'inscription
dimanche 11 janvier 2004
Statut
Membre
Dernière intervention
1 octobre 2004
-
Je trouve ce code très intéressant car dans le cas du cryptage il évite une perte de temps phénoménal.

Merci encore ;-)
Afyn
Messages postés
613
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
-> Proger
Je pense pas que DoEvents dure 1ms ...
A mon avis, il rend la main immédiatement ...
Au moins dans certain cas.
Ds Mon WaitableTimer en forcant la Priorité sur Critical en tout cas ...
Si quelqu'un arrive a mesurer !

A+
Afyn
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
Pour continuer le débat là ou s'arrête MadLucas :
Mais alors si DoEvents fait rigoureusement la même chose que le DoEv de Unreal, comment expliquer que DoEvents est *plus lent* que DoEv ?
Petite piste à 10 balles : DoEvents (aka rtcDoEvents dans msvbvm60.dll) , en outre de plaçer le message du processus en cours en fin de stack win, ne doit-il pas non plus gérer l'IDE de vb ? je suppose que l'api rtcDoEvents, en plus de faire la même chose que DoEv, doit également vérifier un ensemble de paramètres dans l'environnement VB (peut être même lançer un thread pour récupérer l'interruption Ctrl+Pause ...) d'où l'apparente "lenteur".
Par la pratique on remarque que DoEvents dure "au moins" 1 millisecondes, ce qui pose des problèmes de préçision dans les boucles.
Nota : lorsque on compile le programme de test, laquelle des 2 fonctions est la plus rapide ?

Sinon pour ce qui est de faire tourner son appli en "arrière-plan", rien de tel qu'un SetPriorityClass vers idle...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.