Problème lenteur

damien174 Messages postés 78 Date d'inscription jeudi 4 janvier 2001 Statut Membre Dernière intervention 2 mars 2012 - 20 juil. 2005 à 19:33
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 - 21 juil. 2005 à 11:51
bonjour j'aurais une petite question, j'ai fait un datalogger en VB6 (pour station de météo) et j'ai une fonction pour calculé le vent dominant qui est tres longue, avez-vous une sugestion pour quelle soit boucoup plus rapide ?


Public Function Calcul_Dominant_1(Valeur_Date As String) As String
Dim MySql As New ADODB.Recordset
Call MySql.Open("SELECT V_Dir FROM Tab_vents WHERE jours_r='" & Left(Valeur_Date, 4) & "-" & Mid(Valeur_Date, 6, 2) & "-" & Mid(Valeur_Date, 9, 2) & "' AND V_Moy <> 0 ", cn, adOpenDynamic)
Dim Tmp As String
Dim G As Integer, H As Integer
Dim I As Integer
I = 0
For G = 0 To 15
Nombre_D(G) = 0
Next G
While Not MySql.EOF
Tmp = Conv_Vent_Num_Dir(Val(MySql!V_Dir)) ' retourne le nom de la direction par rapport a l'angle
For G = 0 To 15 If Direction_D(G) Tmp Then Nombre_D(G) Nombre_D(G) + 1
Next G
MySql.MoveNext
' DoEvents
Wend
MySql.Close
H = 0
For G = 0 To 15
If Nombre_D(G) > H Then
Calcul_Dominant_1 = Direction_D(G)
H = Nombre_D(G)
End If
Next G
End Function

merci

cyberdam

7 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2005 à 20:51
Public Function Calcul_Dominant_1(Valeur_Date As String) As String

Dim MySql As New ADODB.Recordset


Call MySql.Open("SELECT V_Dir FROM Tab_vents WHERE jours_r='" &
Left(Valeur_Date, 4) & "-" & Mid(Valeur_Date, 6, 2) & "-"
& Mid(Valeur_Date, 9, 2) & "' AND V_Moy <> 0 ", cn,
adOpenDynamic)

Dim Tmp As String

Dim G As Integer, H As Integer

Dim I As Integer

I = 0

For G = 0 To 15

Nombre_D(G) = 0

Next G

While Not MySql.EOF

Tmp =
Conv_Vent_Num_Dir(Val(MySql!V_Dir)) ' retourne le nom de la direction
par rapport a l'angle

For G = 0 To 15

If Direction_D(G) Tmp Then Nombre_D(G) Nombre_D(G) + 1

Next G

MySql.MoveNext

DoEvents

Wend

MySql.Close

H = 0

For G = 0 To 15

If Nombre_D(G) > H Then

Calcul_Dominant_1 = Direction_D(G)

H = Nombre_D(G)

End If

Next G

End Function


Pourquoi avoir mis en commentaire le DoEvents ? Remets le, ca devrait te faire gagner pas mal de temps !


DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
damien174 Messages postés 78 Date d'inscription jeudi 4 janvier 2001 Statut Membre Dernière intervention 2 mars 2012
20 juil. 2005 à 21:00
oui merci mais j'aime pas trop mettre de doevents car apres j'ai des dépassements de piles.
mais sinon y a pas un autre moyen de faire mon calcul plus simplement ou travaillé en mémoire pour accelérer la function ?

cyberdam
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
20 juil. 2005 à 22:39
Un DoEvents qui te provoque des dépassement de piles ??? Je ne vois pas
trop le rapport : La pile sature lorsqu'on appelle des fonctions
récursives indéfiniment. Le DoEvents sert à donner la main à Windows
pour raffraichir les contrôles, et donner la main aux autres processus,
ce qui, contrairement à ce qu'on peux penser, accèlére une fonction qui
est trop longue car on ne sature plus les messages de Windows.

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 1
21 juil. 2005 à 00:05
Salut, je crois que tu t'egare là DarkSidious, DoEvents ne sert et ne servira jamais a accelerer une fonction, mais sert a donner la main au system pendant l'execution de la fonction en permettant d'autres fonction de s'executer, ce qui au contraire ralenti cette fonction. De plus, il est vrai que l'utilisation de DoEvents n'est pas conseiller dans le cas ou une fonction s'execute evenementiellement parlant, car cette meme fonction peut s'executer plusieurs fois, et dans ce cas generer un depassement de pile.


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0

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

Posez votre question
Ricks27 Messages postés 79 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 29 juillet 2005
21 juil. 2005 à 09:25
Bonjour,



En ce qui concerne le "DoEvents", je suis tout à fait d'accord avec Warning.



Par contre, si tu veux optimiser ta routine, tu peux utiliser les Index si ta basse de données est une base de données Access.



Le gain de temps est concequent . En effet, les index evitent de
parcourir tout tes enregistrements pour trouver ceux qui t'intéressent.
Tu te positionne directement sur les enregistrements que tu as besoin.



Si tu n'as jamais utilisé les index, je peux te poster un exemple et t'expliquer brièvement.



Ricks27
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 juil. 2005 à 10:11
Ben il suffit de faire un sémaphore pour éviter les problèmes d'appel
consécutifs suite à un appel de fonction par un événement...



Je persiste à dire que le DoEvents permet quand même d'obtenir plus de
rapidité dans une longue boucle car il évite de bloquer le
système !



Dans des petites fonctions, je suis d'accord que le DoEvents ralentit l'éxécution, mais dans une longue fonction y'a pas photo !



Donc une petite sémaphore devrait régler le problème de dépassement de pile :



Public Function Calcul_Dominant_1(Valeur_Date As String) As String

Static bFinish As Boolean

if Not bFinish Then Exit function

if bFinish Then let bFinish = False

Dim MySql As New ADODB.Recordset


Call MySql.Open("SELECT V_Dir FROM Tab_vents WHERE jours_r='" &
Left(Valeur_Date, 4) & "-" & Mid(Valeur_Date, 6, 2) & "-"
& Mid(Valeur_Date, 9, 2) & "' AND V_Moy <> 0 ", cn,
adOpenDynamic)

Dim Tmp As String

Dim G As Integer, H As Integer

Dim I As Integer

I = 0

For G = 0 To 15

Nombre_D(G) = 0

Next G

While Not MySql.EOF

Tmp =
Conv_Vent_Num_Dir(Val(MySql!V_Dir)) ' retourne le nom de la direction
par rapport a l'angle

For G = 0 To 15

If Direction_D(G) Tmp Then Nombre_D(G) Nombre_D(G) + 1

Next G

MySql.MoveNext

DoEvents

Wend

MySql.Close

H = 0

For G = 0 To 15

If Nombre_D(G) > H Then

Calcul_Dominant_1 = Direction_D(G)

H = Nombre_D(G)

End If

Next G

Let bFinish = True

End Function




DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
0
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 1
21 juil. 2005 à 11:51
Je crois que tu confond rapidité d'execution et rapidité de reprise en main. En effet, si ta fonction doit s'executer par exemple 300fois, qu'elle soit longue ou pas,si tu utilise un doevents le programme mettra plus de temps a executer la fonction 300 fois bien que tu es la main sur l'application.


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0