samideqlqpart Posté(e) le 26 septembre 2017 Posté(e) le 26 septembre 2017 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 progressbarSinon 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 2013merci
(gile) Posté(e) le 26 septembre 2017 Posté(e) le 26 septembre 2017 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
samideqlqpart Posté(e) le 27 septembre 2017 Auteur Posté(e) le 27 septembre 2017 Bonjour, j'arrive pas à attacher les fichiers....Le serveur a retourné une erreur durant l'envoi....je vais etre plus explicite je suis sur autocadc'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à.
(gile) Posté(e) le 28 septembre 2017 Posté(e) le 28 septembre 2017 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
samideqlqpart Posté(e) le 28 septembre 2017 Auteur Posté(e) le 28 septembre 2017 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
(gile) Posté(e) le 29 septembre 2017 Posté(e) le 29 septembre 2017 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
samideqlqpart Posté(e) le 1 octobre 2017 Auteur Posté(e) le 1 octobre 2017 salutje 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?
samideqlqpart Posté(e) le 5 octobre 2017 Auteur Posté(e) le 5 octobre 2017 BonjourJ'ai un peu réduit le temps d'impression grace à Stopwatchj'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.
(gile) Posté(e) le 5 octobre 2017 Posté(e) le 5 octobre 2017 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
samideqlqpart Posté(e) le 5 octobre 2017 Auteur Posté(e) le 5 octobre 2017 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.
samideqlqpart Posté(e) le 5 octobre 2017 Auteur Posté(e) le 5 octobre 2017 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
(gile) Posté(e) le 5 octobre 2017 Posté(e) le 5 octobre 2017 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
samideqlqpart Posté(e) le 9 octobre 2017 Auteur Posté(e) le 9 octobre 2017 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 Codemais un peu compliqué; qui répond peut être à ma question?
samideqlqpart Posté(e) le 25 octobre 2017 Auteur Posté(e) le 25 octobre 2017 bonjour je suis arrivé à ce point avec l'utilsation de stopwatchun 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?
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant