IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Améliorer la vitesse d'affichage


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut Améliorer la vitesse d'affichage
    Bonjour tout le monde

    Je veux utiliser la fonction de la famille Thread* et les procédures internes afin d’améliorer la vitesse de l'affichage des données dans une table mémoire.

    Malgré tout cela l'affichage est encore longue, je ne sais pas peut être j'ai mal à utiliser les fonctions Thread* parce que c'est la première fois à exploiter ces fonctions
    Voila mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
     
    I est un entier=1
     
    ThreadExécute("Remplit", threadNormal,AjouteArticle)
     
    	PROCÉDURE INTERNE AjouteArticle
     
    	tabLignes est tableau de chaînes
     
    	//RequeteAchatParDepot: Affiche les article achetés dans le fichier détailAchat
     
    	RequeteAchatParDepot.ParamND	=fnNumDepot
    	HExécuteRequête(RequeteAchatParDepot,hRequêteDéfaut)
    	HLitPremier(RequeteAchatParDepot)
    	POUR TOUT RequeteAchatParDepot
    		Ajoute(tabLignes,...
    		RequeteAchatParDepot.Reference 		+TAB+...
    		RequeteAchatParDepot.ARTICLE 		)
     
    	FIN
     
    	//RequeteVenteParDepot: Affiche les article vendus dans le fichier détailVente
    	RequeteVenteParDepot.ParamND	=fnNumDepot
    	HExécuteRequête(RequeteVenteParDepot,hRequêteDéfaut)
    	HLitPremier(RequeteVenteParDepot)
    	POUR TOUT RequeteVenteParDepot
    		Ajoute(tabLignes,...
    		RequeteVenteParDepot.Reference 		+TAB+...
    		RequeteVenteParDepot.ARTICLE 		)
    	FIN
     
     
    	ExécuteThreadPrincipal(AjouteDansTABLE1)
     
    		PROCÉDURE INTERNE AjouteDansTABLE1
     
    //		j'ajoute les articles une table mémoire
    		POUR TOUT sLigne DE tabLignes
    			//Pour éviter les doublons article
    			SI TableCherche(TABLE1.COL_Refrence,ExtraitChaîne(sLigne,1,TAB,DepuisDébut))=-1 ALORS
    				TableAjoute(TABLE1,sLigne)
    			FIN	
    		FIN
     
    		TableAjoutEnCours(TABLE1,Faux)
     
    		FIN
     
     
     
    	ExécuteThreadPrincipal(AfficheDernierPrix)
     
    		PROCÉDURE INTERNE AfficheDernierPrix
     
    //		Je lis les derniers prix achat
     
     
    		RequeteLitDernierPrixAchat.ParamReference				=TABLE1.COL_Refrence
     
    		HExécuteRequête(RequeteLitDernierPrixAchat,hRequêteDéfaut)
     
    		HLitDernier(RequeteLitDernierPrixAchat)
    		SI PAS HEnDehors(RequeteLitDernierPrixAchat) ALORS
     
     
    			xPrix		=RequeteLitDernierPrixAchat.PrixVente/(1+RequeteLitDernierPrixAchat.TAUXTVA*0.01)	
    			xRemise		=RequeteLitDernierPrixAchat.REMISE	
    			xTauxdevise	=RequeteLitDernierPrixAchat.TauxDevise
    			xTVA		=RequeteLitDernierPrixAchat.TAUXTVA
    			xDPRMP		=RequeteLitDernierPrixAchat.PRMP
     
    		FIN
     
    			TABLE1.COL_Prix			=xPrix
    			TABLE1.COL_Remise		=xRemise
    			TABLE1.Col_TauxDevise	=xTauxdevise
    			TABLE1.COL_TVA			=xTVA
    			TABLE1.COL_PRMP			=xDPRMP
     
     
     
    			TABLE1.COL_PrixNet		=TABLE1.COL_Prix		*(1-TABLE1.COL_Remise*0.01)
    			TABLE1.COL_PrixNetTTC	=TABLE1.COL_PrixNet		*(1+TABLE1.COL_TVA*0.01)
    			TABLE1.COL_Total			=TABLE1.COL_Qte		*TABLE1.COL_PrixNet
    			TABLE1.COL_TotalTTC		=TABLE1.COL_Qte			*TABLE1.COL_PrixNetTTC
    			TABLE1.COL_MADHT			=TABLE1.COL_Total	*TABLE1.Col_TauxDevise
    			TABLE1.COL_MADTTC		=TABLE1.COL_TotalTTC	*TABLE1.Col_TauxDevise
     
     
     
    			I++
    		FIN
     
    		Jauge()
     
     
     
     
    	FIN
    Merci d'avance de me corriger mon code ou donner moi des pistes

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Ceci m'a l'air compliqué. Et quand c'est compliqué, c'est long.

    A mon avis, les threads ne vont pas t'aider du tout pour ton besoin. Oublie cette piste.

    Ce qu'il faut faire , c'est d'abord DIAGNOSTIQUER ce qui ne va pas. Dire que c'est long, c'est une chose, mais il faut avoir une idée des portions de codes, ou des commandes qui prennent le plus de temps.
    Pour ça, il y a un outil très efficace dans Windev. Dans l'environnement de développement, tu fais Projet // Analyseur de performance // Analyser les performances.
    Ca lance ton projet en mode test. Tu fais en sorte d'exécuter le moins de chose possible, si possible uniquement le code qui te pose problème, puis tu quittes le programme. Tu vas avoir une synthèse de tout ce qui s'est passé. Pour chaque commande (TableCherche, tableCherche etc etc ), tu vas avoir le temps total pris par cette commande. Tu pourras donc mieux comprendre les portions de code qui posent problème.

    Tu peux aussi mettre les instructions AnalyseurDebut() et AnalyseurFin() dans ton code, pour que l'analyseur se déclenche uniquement sur la partie que tu as besoin d'améliorer.

    En principe, pour des trucs comme ça, des requêtes SQL devraient être très utiles. Si tu organises bien ta requête, c'est le moteur HFSQL qui va faire tout le travail, et tu n'auras aucune commande du type tableCherche dans ton code. (au moins dans cette partie, tu ne peux pas te passer de cette commande à 100%)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 264
    Points
    5 264
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Dans un premier temps, es-tu en mode C/S ou en monoposte.
    Dans le premier cas, HSurveille() serait un peu moins gourmand.

    Dans un deuxième temps, pourquoi ne pas lier ton champ à la requête, ou alors, si tu veux le remplir par programmation, directement passer par la lecture de la requête.
    Le mode, lecture requête, écriture tableau, lecture tableau (dont les données sont celles de la requête,) écriture champ comporte à mon avis 2 phases de trop.

    Enfin, le contrôle des doublon peut se faire au niveau de la requête (SELECT DISTINCT via SQL ou "Supprimer les doublons" via l'éditeur de requêtes)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par tbc92 Voir le message

    Merci toujours tbc92

    J'ai trouve la partie du code qui pose le problème du temps, celle de calcule du stock (je n'ai pas un fichier dans lequel j'enregistre les stocks finaux) alors je dois calculer le stock de chaque article présent dans la table mémoire.

    Lors j'enlève cette procédure (calcule du stock) la vitesse est devient normale.

    c'est une procédure qu j'ai oublié de la mentionnée en haut

    Citation Envoyé par Voroltinquo Voir le message

    Merci Voroltinquo

    Je suis en mode C/S
    je n'utilise pas HSurveille()
    pour le doublon j'ai déjà mis "Supprimer les doublons" via l'éditeur de requêtes), mais j'a deux requêtes (Achat et vente) par exemple la requête 1 contient l'article "A" et la requête 2 contient l'article "A" et je veux afficher un seul article dans ma table

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Comme tu as 2 fichiers à interroger, tu peux faire :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select reference, article from AchatparDepot
    UNION
    select reference, article from VenteparDepot
    Comme ça, c'est le serveur qui se charge de supprimer les doublons, et par construction, le serveur est plus rapide que le poste client.
    Tu vas gagner un peu.

    Mais sur ce que tu nous as montré, le truc qui est très gourmand, c'est : Pour chaque produit, lancer une requête pour aller chercher le Dernier-Prix-D'achat.

    Ici, j'imagine que ton serveur et ton poste de développement, ils sont dans la même salle, ils sont voisins. Donc, tu es dans une situation très favorable. Dans la vraie vie, ce sera pire.

    Un des trucs qui est très long, c'est de lancer un appel vers la base de données. Chaque appel a un coût fixe, peu importe qu'on ramène 1 seule information ou 1000.
    Idéalement, il faut ramener toutes les informations nécessaires en une seule requête.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select  a.reference, a.article, b.prix_achat
    from 
    (
    select reference, article from AchatparDepot
    UNION
    select reference, article from VenteparDepot
    )  a ,
       fichier_achat b 
    where b.reference = a.reference

    Tu dois pouvoir faire une requête, proche de celle-ci, et en lançant cette requête, puis FichierVersTableMemoire(), tu auras ton résultat en une seule étape, au lieu de 2 étapes pour les 2 fichiers de départ, puis n appels pour les différents articles.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 378
    Points : 40
    Points
    40
    Par défaut
    Merci encore une fois

    je vais reformuler mon code

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/05/2012, 17h44
  2. Réponses: 6
    Dernier message: 30/06/2008, 10h14
  3. problème du pause (sleep) ou problème vitesse d'affichage (Swing)
    Par MAD_Tarik dans le forum EDT/SwingWorker
    Réponses: 15
    Dernier message: 17/04/2007, 13h47
  4. Splash screen et vitesse d'affichage
    Par pierrot67 dans le forum Delphi
    Réponses: 4
    Dernier message: 09/12/2006, 16h37
  5. Vitesse d'affichage GDI
    Par acanicio dans le forum Delphi
    Réponses: 12
    Dernier message: 27/10/2006, 18h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo