Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème lenteur [ Archives Visual Basic / J'AI BESOIN D'AIDE !!!! :) ] (damien174)

mercredi 20 juillet 2005 à 19:33:15 | Problème lenteur

damien174

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


mercredi 20 juillet 2005 à 20:51:18 | Re : Problème lenteur

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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/

mercredi 20 juillet 2005 à 21:00:04 | Re : Problème lenteur

damien174

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

mercredi 20 juillet 2005 à 22:39:21 | Re : Problème lenteur

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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/

jeudi 21 juillet 2005 à 00:05:38 | Re : Problème lenteur

Warning

Administrateur CodeS-SourceS
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/


jeudi 21 juillet 2005 à 09:25:07 | Re : Problème lenteur

Ricks27

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

jeudi 21 juillet 2005 à 10:11:00 | Re : Problème lenteur

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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/

jeudi 21 juillet 2005 à 11:51:27 | Re : Problème lenteur

Warning

Administrateur CodeS-SourceS
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/




Cette discussion est classé dans : date, nombre, mysql, valeur, dominant


Répondre à ce message

Sujets en rapport avec ce message

validation de la date [ par jean ] bonjour,c une application qui consiste à calculer le nombre d'heure passées dans un parking. le Parking est ouvert de 6.00 am à 22h00 . la date de dép Calculer le nombre de jours entre 2 dates [ par Billy ] Bonjour j aimerais avoir un exemple d'un codage pour calculer le nombre de jours restant entre la date d'aujourd'hui et une autre date. Insertion d'une date dans une table [ par pierre751 ] BonjourMon pb est le suivant : Dans 1 formulaire Access Je récupère la valeur d'une zone de texte qui est une date (jj/mm/aa) lorsque j'essaye d'inser DATE????? [ par javi ] Bonjour,je désire faire une soustraction entre 2 date...exemple:a= 01/11/2001 (date system)b= 01/12/2001 (date introdiute par l'utilisateur)j'aimerais Nombre de jour entre 2 Date !!! [ par Sylvain ] Comment peux on calculer le nombre de jour qu'il y a entre 2 date :Exemple :19/08/99 - 19/07/88 = ?Merci d'avance Calculer le nombre de jours feries entre deux date [ par celesdane ] Salut à tousje voudrais calculer le nombre de jours feries entre deux sur VBA.merci d'avance Conversion d'un nombre en date(jj:mm:aa). Aidez moi SVP. [ par aamanguie ] Ma préocupation est la suivante. J'ai ue table (Matable)avec le champ date exprimé en nombre de jours calendair càd 35 (jour de l'an 2001) représente Convertion d'un champ date en valeur null en asp [ par Nike43 ] Les champs dates de Acces ne pouvant comporter une chaîne vide, j'obtiens une erreur de type lors d'un insertion à partir de ma page en asp.Comment pu


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.