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

VB.NET Discussion :

[VB.NET] Création et ouverture d'objet - temps énorme


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut [VB.NET] Création et ouverture d'objet - temps énorme
    Bonjour,

    Je pilote une imprimante d'étiquette via VB.
    Pour ce faire, j'ai ajouté la .tlb proposé par le constructeur, j'importe le namescpace, puis je crée l'objet et je l'ouvre et bah bien sûr je m'en sers.
    Tout fonctionne très bien SAUF que le temps de création et d'ouverture surtout (pour aller parcourir mon layout .lbl ...) prends un temps énorme, et ca donne l'impression que le boutton ou en fait le programme a planté.
    Solution: j'ai déplacé la création et l'ouverture de l'objet dans le chargement de l'MDI, comme ca ,j'ai résolu le problème du boutton, mais le chargement plante d'un seul coup (une 50 aines de secondes) , moi je sais d'où ca vient, alors je patiente, mais pour un utilisateur, il va mettre sa main sur son coeur et espérer que son PC ne va pas exploser...enfin bon que soit, je veux qu'au moment de chargement ouvrir une fenêtre en paralèlles que que la chargement pour dire à l'utilisateur une sage phrase comme "Patientez SVP" ou "Création d'Objet" ou quelque choses comme ca; surtout que je ne veux pas voir les utilisateurs avec des aires débiles devant mon application dès le premier lancement. Avez vous une idée?

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Salut
    Je suis pas sûr d'avoir bien compris. Tu cherches a afficher un message pendant la 1ère création d'une form (assez lente le temps de builder), c'est cela?
    Si oui, pourquoi ne pas utiliser un backgroundWorker (voire un thread) associé à un timer qui affichera le message pendant qu'en fond tu créeras ta form?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  3. #3
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Moi je suis sûr que tu a bien compris ! juste tes propositions m'ont l'air en chinois, non! faut pas exagérer, j'en ai tiré le mot Timer (que j'utilisais en VB6 dans la nuit des temps) ..., si tu veux expliquer un peu plus, nous seront moi et tout les utilisateurs reconnaissants à tigunn!

    Merci

  4. #4
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Flate, Flate, Flate
    Euhm bon ok... Voici un exemple d'utilisation d'un backgroundworker (System.ComponentModel.BackgroundWorker) pour la restauration d'une base de données SQL Serveur.
    Bouton "lancer la restauration"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub ButtonRestaurer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRestaurer.Click
          If MsgBox("Cette opération va modifier de façon définitive la base de donnée." & vbCrLf & "En cas de restauration a partir d'une ancienne sauvegarde, le programme risque de ne plus fonctionner, Voulez vous continuer? ", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
             RestaurationEnCour = True
             Me.BGWRestauration.RunWorkerAsync() 'lance la tache en fond
          End If
       End Sub
    Traitement de la tache en fond (auto):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub BGWRestauration_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWRestauration.DoWork
     
    ...
    End Sub
    Et en fin de traitement (auto):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub BGWRestauration_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGWRestauration.RunWorkerCompleted
          RestaurationEnCour = False
          If Me.LabelMessage.Text = "erreur lors de la restauration" Then
             Me.Close()
             Master.Close()
          Else
             Me.Close()
             Application.Restart()
          End If
       End Sub
    Ceci n'est qu'un exemple mais je pense que cela devrait être utile.
    Bon dev'
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  5. #5
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Super !

    je me suis enfin basé sur le tuto de LARDE Geoffrey :

    http://glarde.developpez.com/dotnet/bgworker/vb/

    Merci tigunn pour le backgroundworker, et merci à sperot pour l'explication du thread (dans un autre poste).

  6. #6
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Me voilà de retour, j'ai le tuto du BackgoundWorker mais je ne sais pas bien m'en servir.

    Quand je lance mon application (démarre directement avec une MDI), je charge des objets et j'ouvre des layouts. le problème c'est que l'interface gel, et on ne peut cliquer sur rien! quelque secondes après, l'application de décontracte et fonctionne normalement.

    Je exploiter la puissance du BackGroundWorker pour arriver à :

    Charger l'application avec une petite interface au milieu (de l'MDI), cette interface comprendra un progresse barre qui me donnera l'etat de chargement et l'ouvreture des layouts (le traitement lourd).

    Sauf que je ne sais pas bien comment procéder?

    Merci de votre aide.

  7. #7
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Pour être plus précis, le BackGroundWorker, je sais l'utiliser séparement, alors créer un nouveau thread qui s'execute en paralèle, ce que je souhaite, c'est comment combiner ca avec l'affichage de progression en utilisant un progress bar?

  8. #8
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 201
    Points : 173
    Points
    173
    Par défaut
    Salam,

    Citation Envoyé par tssi555 Voir le message
    Pour être plus précis, le BackGroundWorker, je sais l'utiliser séparement, alors créer un nouveau thread qui s'execute en paralèle, ce que je souhaite, c'est comment combiner ca avec l'affichage de progression en utilisant un progress bar?
    Si tu veux utiliser un progressbar avec le backgroundworker il faut utiliser l'événement RunWorkerProgress (je ne me r'appel pas du nom exacte du l'événement mais ca va vers RunWorkerProgress).
    En fait il y a 3 événement essentiel pour un BackGroundWorker les 2 premier tu les connais déjà, le 3eme est celui que je vient de mentionner.

    Ce dernier te donne le taux de progression du BGWorker. Bien sur cela depond de ce que tu a lancer dans BGWorker(Comptable ou non)(Le taux c'est toi qui le calcule).

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    @tssi555 :
    je crois que c'est à toi que j'ai fais un exposé assez complet sur le multithreading récemment
    pas lu ou pas clair ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Oui oui sperot , c'est à moi, tu a fais l'exposé des thread.

    Juste, pour ce que je cherche, c'est de faire tourner un processus En paralèlle avec la progression d'unProgressBar, sinon pour le fonctionnement des Thread, je l'ai - plus ou moins - compris, re-merci pour ton explication détaillée de l'autre fois.

  11. #11
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Salut tssi555,
    voici un exemple avec la progessbar:
    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
    Private Sub ButtonSauver_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSauver.Click
          Me.PBSauvegarde.Visible = True      'ma ProgressBar
          BGWSauvegarde.RunWorkerAsync()
       End Sub
     
    Private Sub BGWSauvegarde_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BGWSauvegarde.ProgressChanged
          Me.PBSauvegarde.Value = e.ProgressPercentage
       End Sub
     
    Private Sub BGWSauvegarde_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGWSauvegarde.DoWork
    ... traitement partie 1
    Me.BGWSauvegarde.ReportProgress(10)
    ...traitement parttie 2
    Me.BGWSauvegarde.ReportProgress(45)
    ...traitement parttie 3
    Me.BGWSauvegarde.ReportProgress(100)
    end Sub
     
    Private Sub BGWSauvegarde_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BGWSauvegarde.RunWorkerCompleted
          Me.PBSauvegarde.Value = 0
          Me.PBSauvegarde.Visible = False
          CloseForm = True
       End Sub
    Bon dev'
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  12. #12
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Merci infiniment tigunn!

    Ton exemple m'a beaucoup aidé pour trouver ce que je cherchais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB.NET Création dynamique de nom d'objets
    Par PizzaBer dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2006, 11h41
  2. [VB.NET] Création d'objet dynamique
    Par Torkan dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/05/2006, 04h18
  3. [VB.NET] Création de control après ouverture du form
    Par boulete dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/03/2006, 13h06
  4. [CR][VB.NET]Création d'un état
    Par rolan dans le forum SDK
    Réponses: 10
    Dernier message: 30/09/2004, 12h24
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 19h36

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