Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

J’ai réalisé un programme qui affiche un dessin à partir de certaines données.

A fur et à mesure que j’avance dans mon programme, le dessin met beaucoup de temps à être afficher.

La procédure :

J’introduis les données dans une interface et je lance l’exécution, tout est ok !

Une fois que j’indique un point d’insertion le dessin met un certain temps pour s’afficher et cela à la première exécution du programme.

Mais seulement après, il est plus rapide comme si des dll ont étaient chargées.

Je que je cherche c’est comment occuper l’attention de l’utilisateur avec par exemple une progress bar ou un message l’informant de patienter.

Car j’ignore quand le dessin va apparaitre donc je ne peux pas fixer le "setlimit" de la progressbar

Sinon comment matérialiser le moment où le dessin apparait ?

J’ai déjà posté sur des sites anglophones mais pas de solution au problème.

j'utilise vb.net ,autocad 2013

merci

Posté(e)

Salut,

 

Il faudrait que tu sois plus clair.

Qu'est-ce que c'est ce "dessin à partir de certaines données" que le programme affiche ?

Doit-il s'afficher dans AutoCAD ?

Sous forme de référence de bloc ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour, j'arrive pas à attacher les fichiers

....Le serveur a retourné une erreur durant l'envoi....

je vais etre plus explicite

je suis sur autocad

c'est une application qui se charge de dessiner des poteaux de batiment.

je charge mon application avec NETLOAD.

il ya là une interface qui me demande d'introduire les données tels que;hauteur de poteau, largeur, hauteur d'etage , etc...

Une fois les données introduites je lance l'exécution.

maintenant je precise un point d'insertion sur autocad.

et me voilà attendre l'affichage du poteau qui met un bon bout de temps pour apparaitre!

ok je relance l'application ,introduction de données,...

l'affichage du dessin maintenant est plus rapide !

Comme dans le programme je charge des layers, des styles de cotation, styles de textes....

peut etre que ça met du temps pour les charger à la première exécution et après c'est ok?

je n'utilise pas de bloc.

Donc je cherche à combler ce temps d'attente par un message priant l'utilisateur de patienter et qui disparait à l'apparition du dessin ou une progressbar.

comme je ne sais pas à quel moment il va apparaitre et voilà.

Posté(e)

Salut,

 

Ce que tu décris ici (ou sur TheSwamp) m'étonne beaucoup.

La lenteur à la première exécution peut être due à la compilation JIT du code MSIL et/ou au chargement de calques, styles etc.

Dans le premier cas, il faut vraiment qu'il y ait beaucoup de code à compiler pour que la différence entre la première exécution et les suivantes soit sensible.

Dans le deuxième cas, la manière dont tu "charges" les calques et styles doit très certainement pouvoir être optimisée. Tu dis utiliser des DLLs pour faire ça, est-ce bien le plus efficient ? Parce que importer des objets depuis un dessin/gabarit ou créer ces objets à la volée ne devrait pas prendre plus d'une seconde (à moins qu'on parle de milliers d'objets).

Tu peux facilement savoir si c'est le chargement de ces objets qui ralenti l'exécution en lançant ton programme dans un dessin/gabarit qui a déjà ces objets.

Pour faire un diagnostic plus précis des "goulots d'étranglement", tu peux, comme on te l'a conseillé sur TheSwamp, utiliser une instance de StopWatch.

 

Ceci étant, pour "matérialiser" l'attente, tu as le chois entre le ProgressMeter d'AutoCAD et un ProgressBar Windows.

Le second est plus complexe à mettre en œuvre : généralement on utilise un BackgroundWorker pour que le ProgressMeter et la tache s'exécutent sur deux Threads différents.

 

Dans tous les cas, d'après ce que tu décris "l'attente" devrait démarrer au moment où l'utilisateur spécifie le point d'insertion et se terminer quand le code finit de dessiner la dernière entité.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

salut!

j'ai vainement essayer une instance de StopWatch mais rien eu.

Seulement maintenant, ce que je cherche exactement comme tu l'as remarquer;

comment savoir quand le code finit de dessiner la dernière entité.?

car à mon niveau entre la première et dernière entité c'est du "nanoseconde"le dessin s'affiche en entier en une fraction de seconde

et à partir de la je peux peut etre mettre un message d'attente qui doit disparaitre dès que le dessin est affiché.

En ce qui concerne les calques, styles de textes , de cotes, etc... le code est etabli d'une manière tel qu'il s'assure d'abord

si le calque existe sinon il en crée un.

 

voici à titre d'exemple un code pour le style de textes et c'est la même procédure pour les calques , cotation

crées un à un, peut etre le problème est ici, car pour une dizaine de layer........

Dim acTextTbl As TextStyleTable

acTextTbl = acTrans.GetObject(acCurDb.TextStyleTableId, _

OpenMode.ForRead)

Dim Texttitre As String = "Text titre"

If acTextTbl.Has(Texttitre) = False Then

Dim acTextTblRec As TextStyleTableRecord = New TextStyleTableRecord()

acTextTblRec.Name = Texttitre

acTextTblRec.TextSize = 40

acTextTblRec.XScale = 1.5

acTextTblRec.FileName = "Consolas.shx"

acTextTbl.UpgradeOpen()

acTextTbl.Add(acTextTblRec)

acTrans.AddNewlyCreatedDBObject(acTextTblRec, True)

End If

Posté(e)

Salut,

 

Ce genre de procédure ne devrait pas ralentir plus que ça l'exécution de ton programme.

 

Pour l'utilisation de Stopwatch, c'est assez simple :

Tu crées une instance de Stopwatch(). Au moment où l'utilisateur spécifie le point d'insertion, tu démarres le chronométrage et tu récupères des temps intermédiaires après chaque opération (ou groupe d'opérations), une fois toutes les opérations terminées tu arrêtes le chrono et tu affiches les résultats.

 

            ' créer une instance de Stopwatch '
           Dim sw = New System.Diagnostics.Stopwatch()

           ' démarrer le chronométrage '
           sw.Start()

           ' exécuter la première opération '

           ' prendre un premier temps intermédiaire à la fin de cette opération '
           Dim t1 As Long = sw.ElapsedMilliseconds

           ' exécuter la deuxième opération '

           ' prendre un deuxième temps intermédiaire à la fin de cette opération '
           Dim t2 As Long = sw.ElapsedMilliseconds

           ' exécuter la troisième opération '

           ' prendre un troisième temps intermédiaire à la fin de cette opération '
           Dim t3 As Long = sw.ElapsedMilliseconds

           ' exécuter la dernière opération '

           ' arrêter le chronomètre à la fin de cette opération '
           sw.Stop()
           Dim total As Long = sw.ElapsedMilliseconds

           ' afficher les résultats '
           Dim ed = Application.DocumentManager.MdiActiveDocument.Editor
           ed.WriteMessage(vbLf & "Première opération: " & t1 & "millisecondes")
           ed.WriteMessage(vbLf & "Deuxième opération: " & t2 - t1 & "millisecondes")
           ed.WriteMessage(vbLf & "Troisième opération: " & t3 - t2 & "millisecondes")
           ed.WriteMessage(vbLf & "Dernière opération: " & total - t3 & "millisecondes")
           ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

salut

je cravache,je trécuche, je me relève et j'avance pas!

je pense devoir revoir quelque chose dans mes codes et procédures.

j'ai trouvé à des endroits je passe 5700 ms de la première exécution à 110 ms en moyenne sur les suivantes.

seulement je reviens toujours à la question:

Comment specifier la fin de l'exécution des codes?

 

 

 

Posté(e)

Bonjour

J'ai un peu réduit le temps d'impression grace à Stopwatch

j'ai trouve que l'utilsation de la condition Case est mieux adaptée que If...then .successifs dont j'abuse.

par contre j'insiste toujours comment indexer l'apparition du dessin après getpoint

..?

Merci.

Posté(e)

Salut,

 

Que veux-tu dire par "apparition du dessin" ?

Ne sachant pas ce que fait ton programme, c'est difficile à dire, mais normalement quand on ajoute des entités dans AutoCAD, il apparaissent quand on appelle Commit() sur la Transaction qui a servi à ajouter ces objets.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

oui c'et bien ça

je pense avoir donner des precision précedemment.

 

et je pense que vous avez decélé mon obstacle, d'ailleurs un peu plus haut vous aviez bien mentionner;

<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">Dans tous les cas, d'après ce que tu décris "l'attente" devrait démarrer au moment où l'utilisateur spécifie le point d'insertion et se terminer quand le code finit de dessiner la dernière entité.

 

en ce qui concerne le programme j'avais ecris:

 

c'est une application qui se charge de dessiner des poteaux de batiment.

je charge mon application avec NETLOAD.

il ya là une interface qui me demande d'introduire les données tels que;hauteur de poteau, largeur, hauteur d'etage , etc...

Une fois les données introduites je lance l'exécution.<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">maintenant je precise un point d'insertion sur autocad.<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">et me voilà attendre l'affichage du poteau qui met un bon bout de temps pour apparaitre!<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">ok je relance l'application ,introduction de données,...<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">l'affichage du dessin maintenant est plus rapide !<br style="color: rgb(28, 40, 55); font-size: 13px; line-height: 19.5px; background-color: rgb(250, 251, 252);">

 

Maintenant,

 

mais normalement quand on ajoute des entités dans AutoCAD, il apparaissent quand on appelle Commit() sur la Transaction qui a servi à ajouter ces objets.

 

Peut etre ce temps d'attente est dù à ça car j'ai une seule transaction pour l'ensemble des codes, d'ou un seul Commit()?????????

j'aurais peut être dù metrre plusieurs transaction?

 

merci pour la perseverance.

Posté(e)

c'est à dire, après chaque entité créée

 

Dim tr As Transaction = db.TransactionManager.StartTransaction()

Using tr

1ere entité.......

tr.AddNewlyCreatedDBObject

tr.Commit()

End Using

 

 

Dim tr As Transaction = db.TransactionManager.StartTransaction()

Using tr

2eme entite .......

tr.AddNewlyCreatedDBObject

tr.Commit()

End Using

Posté(e)

Non, je pense que c'est mieux de ne faire qu'une transaction. Mais si tu veux faire apparaître les entités au fur et à mesure qu'elles sont créées (avant le Commit(), tu peux utiliser la méthode TransactionManager.QueueForGraphicsFlush()

 

Dim tr As Transaction = db.TransactionManager.StartTransaction()
Using tr
   '1ere entité.......
   tr.AddNewlyCreatedDBObject(ent1, True)
   db.TransactionManager.QueueForGraphicsFlush()

   '2eme entite .......
   tr.AddNewlyCreatedDBObject(ent2, True)
   db.TransactionManager.QueueForGraphicsFlush()

   '.......

   'derniere entite .......
   tr.AddNewlyCreatedDBObject(entLast, True)
   tr.Commit()
End Using 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

idem même avec QueueForGraphicsFlush sur chaque entité ajoutée le dessin s'affiche en entier apres un temps d'attente.

par contre j'ai trouvé quelque chose d'interessant fait par Norman Yuan

"Showing Progress for long code execution in AutoCAD" sur Drive AutoCAD with Code

mais un peu compliqué; qui répond peut être à ma question?

  • 3 semaines après...
Posté(e)

bonjour

 

je suis arrivé à ce point avec l'utilsation de stopwatch

un phenomène!

 

la durée totale est de 4823msecondes

 

sw.Start()

armature(acBlkTblRec, acCurDb, acTrans, New Point3d(origTextX, origTextY, 0))

 

sw.Stop()

total = sw.ElapsedMilliseconds

 

Dim ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

 

ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")

 

 

 

Mais en exécutant stopwatch à l'interieur de ma fonction, la durée totale est de 25 msecondes

 

 

Public Sub armature(ByRef acBlkTblRec As BlockTableRecord, ByRef acCurDb As Database, ByRef acTrans As Transaction, _

ByVal origTEXT As Point3d)

 

sw.Start()

 

-

-

-

-

 

 

sw.Stop()

total = sw.ElapsedMilliseconds

 

Dim ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

 

ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")

End Sub

 

 

Ou est le problème?

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité