#1 Mon 20 November 2006 14:41
- nicolas valls
- Participant assidu
- Date d'inscription: 28 Oct 2005
- Messages: 154
code VBA et arcmap qui se met en "Pas de réponse"
Bonjour,
Je programme un petit outil en vba qui ecrit un fihier à partir d'une table arcview. Le processus dure environ 10 minutes. Au début tout marche bien mais au bout de 40 secondes environ, arcmap se fige, se met en "pas de réponse" (gestionnaire des taches windows). Cependant mon programme marche bien et je peux voir (dans l'explorateur) mon fichier qui "grossit" (sa taille augmente environ toutes les 2 secondes). A la fin du processus, arcmap revient normalement et le fichier créé est exact.
Je crois savoir que ce problème est que mon processeur n'est pas assez puissant, mais je me demande si il n'y a pas un moyen de forcer arcmap à dire a windows qu'il est dans un fonctionnement normal.
En effet j'ai constaté depuis le version 9 (ou 9.1 je ne sais plus) que arcmap semble (pour les gros processus) forcer windows pour ne pas etre déclaré en "pas de réponse".
Je ne sais pas si j'ai été assez clair.
PS : j'ai optimisé mon code au maximun, je ne peux donc pas réduire plus mon programme.
Hors ligne
#2 Tue 21 November 2006 00:04
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: code VBA et arcmap qui se met en "Pas de réponse"
Bonjour,
En fait ce problème n'a absolument rien à voir avec un blocage du programme.
C'est windows qui déclare qu'une procédure qui dépasse les 30 s en temps et ceci sans rendre la main de temps en temps il indique que le programme ne réponds plus, si tu possèdes une fenêtre sur ce programme, tu verras qu'elle deviendra blanche.
En fait il faut utiliser de temps en temps la procédure doevents en VB
N'ayant pas arcview, et son VBA je ne sais pas si il a été intégré ou non.
C'est la seule méthode.
cordialement
Dernière modification par Damien BEAUSEIGNEUR (Tue 21 November 2006 00:04)
Hors ligne
#3 Tue 21 November 2006 08:45
- nicolas valls
- Participant assidu
- Date d'inscription: 28 Oct 2005
- Messages: 154
Re: code VBA et arcmap qui se met en "Pas de réponse"
Merci, en effet DoEvents permet a mon aplli de tourner normalement !
Encore merci
Hors ligne
#4 Tue 21 November 2006 10:42
- Olivier De LA POMMERAYE
- Invité
Re: code VBA et arcmap qui se met en "Pas de réponse"
Bonjour,
Le problème vient de Windows qui croit qu'ArcGIS ne tourne plus rond,
mais cela est dû au mode interprété de VBA je pense.
Pour votre soucis, le mieux est d'utiliser la barre de progression
implémenté dans ArcObjects :
Dim oProgressDlgFact As IProgressDialogFactory
Dim oProgressDialog As IProgressDialog2
Dim oStepProgressor As IStepProgressor
Bon travail,
Olivier
#5 Tue 21 November 2006 11:17
- nicolas valls
- Participant assidu
- Date d'inscription: 28 Oct 2005
- Messages: 154
Re: code VBA et arcmap qui se met en "Pas de réponse"
j'utilisais déja cette barre de progression, mais si j'avais le malheur de cahnger de fenetre, le retour a arcmap etait impossible, le doevents a bein résolu mon pb.
Merci quand même
Hors ligne
#6 Tue 21 November 2006 13:33
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: code VBA et arcmap qui se met en "Pas de réponse"
Bonjour,
Effectivement il s'agit d'un imbricage de Thread, VBA étant interprété le Thread Maître (Arcview) lance un thread secondaire (votre programme) et windows le considère comme sans réponse (le thread principal).
Doevents permet de résoudre le pb d'un point de vue "fonctionnement utilisateur", mais attention il laisse à l'utilisateur la possibilité de lancer d'autres procédures! Donc risque de ralentir complétement la machine! Si l'utilisateur n'est pas averti il peut comme ça lancer plusieurs commandes, qui vont donner l'impression que le PC est bloqué.
Une autre solution (testée en VB6) consiste à lancer une fenêtre d'animation comme quand vous copiez des fichiers avec l'explorateur. Toutes les n lignes traitées vous ajouter un rectangle dans la barre de progression, ce qui force le thread maître à reprendre la main. Attention cette solution est valable pour des opérations de gourmandise moyenne en ressource.
Pour ma part j'utilise une dll qui est très gourmande, la solution est d'afficher une fenêtre d'information avant lancement du process, style ("Attention processus long, soyez patient") et mise du curseur souris en mode sablier.
Tout ceci est valable pour VB6, je ne garantit rien en VBA.
Pour le changement de fenêtre il suffit d'afficher la ProgressDialog comme modale, (ou MDI fille), pour qu'il soit impossible de la masquer ou de la changer. Par contre je ne sais pas si c'est possible en VBA
A+
Christophe
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne