Pb d'exception InvalidOperationException [Résolu]

bikini42 41 Messages postés jeudi 5 janvier 2006Date d'inscription 11 juin 2010 Dernière intervention - 11 mai 2007 à 16:10 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 16 mai 2007 à 21:54
Bonjour à tous,

Je vous écris car je progresse petit à petit en C# mais là je suis cofronté à un problème que je n'arrive pas à résoudre.

Mon programme affiche aléatoirement des images pendant 2 secondes puis affiche un fond blancau bout des 2 secondes. Quand l'utilisateur appuie sur Espace, l'image suivante s'affiche etc... Tout ceci s'affiche dans une PictureBox.

Mon problème est le suivant : aléatoirement, j'ai une exception qui arrête le programme, me met en surbrillance la dernière ligne de code suivante pictureBox1.Image = croix;  du code suivant :

public
void Affichage_Image_Load(
object sender,
EventArgs e){

         Code =

"Croix";

         // On affiche la croix centrale         pictureBox1.Image = croix;

}

// Fonction pour tirer aléatoirement l'indice d'une image SANS REMISE

public
void Valea(
ArrayList list,
out
int valeur){

         valeur = 0;

         // On trouve l'indice du dernier élément du tableau

         int LastElementIndex = list.Count-1;

         // On trouve un indice aléatoire dans le nombres d'indices possibles

         int index = RandomClass.Next(0, LastElementIndex);

         // On retient la valeur aléatoire tirée         valeur = (

int)list[index];

         // On remplace la valeur contenue à l'indice tirée par celle

         // du dernier élément du tableau         list[index] = list[LastElementIndex];

         // On retire le dernier élément du tableau         list.RemoveAt(LastElementIndex);

}

// Code pour déclencher l'affichage de l'image en pressant Espace

override
protected
void OnKeyPress(
KeyPressEventArgs e){

         if (e.KeyChar == (
char)
Keys.Space)         {

               compteur++;

               maform3.FinVerif =

false;

               // On trouve un indice aléatoire d'image               Valea(nb_images,

out indice);                Code =

"Img" + indice;               timer.Elapsed +=

new
ElapsedEventHandler(OnElapsed);
// A la fin de ce timer, lancer la fonction OnElapsed

               // On fixe le temps d'affichage grâce à la valeur rentrée

               // dans le formulaire               timer.Interval = (

double)maform3.TempIm.Value;               timer.AutoReset =

false;

               // On affiche l'image le temps du timer               img[indice] =

Image.FromFile(
@"C:\...\Ressources\img" + indice +
".bmp");               pictureBox1.Image = img[indice];

               timer.Start();

               }

}

// Après l'affichage de l'image, au bout du temps défini, on remet la croix centrale

public
void OnElapsed(
Object sender,
ElapsedEventArgs e){
         Code "Croix";         pictureBox1.Image croix;

}

Et m'affiche : L'exception InvalidOperationException n'a pas été gérée par le code utilisateur.   L'objet est actuellement utilisé ailleurs.

Or, tout fonctionne bien pendant un certain temps et je ne comprend pas pkoi, aléatoirement, il m'affiche cette erreur.

Quelqu'un sait pourquoi j'obtiens ça et comment je peux le résoudre?

Merci d'avance
Afficher la suite 

8 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 14 mai 2007 à 10:11
+3
Utile
Puisque tu sembles être dans une Form, tu peux utiliser un System.Windows.Forms.Timers si le contexte si prête.
Ca devrait t'éviter ce genre de problème ^^

<hr />
-Blog-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 15 mai 2007 à 10:24
+3
Utile
C'est un peu différent, mais tu peux en principe faire la même chose.
Pour le Elapsed, l'équivalent est Tick, pour l'autoReset, je ne sais plus par coeur ce que ça fait, mais faire un Start/Stop pouRRait provoquer un fonctionnement similaire...

<hr />
-Blog-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 12 mai 2007 à 16:33
0
Utile
Salut,

Je suppose que tu utilises System.Timers.Timer, auquel cas ton problème vient d'accès concurrents, car l'event Elapsed est levé dans un autre thread. Tu as donc en supplément un problème d'opération "Cross-Thread" => http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
bikini42 41 Messages postés jeudi 5 janvier 2006Date d'inscription 11 juin 2010 Dernière intervention - 14 mai 2007 à 09:23
0
Utile
Merci coq pr ton indication ;)

Cependant, je ne vois pas où mes opérations peuvent se croiser puisque mon Elapsed s'effectue après l'écoulement d'un timer et que, à la fin du timer, je remplace seulement l'image d'une picturebox par une autre....

Je ne vois donc pas comment appréhender le pb dont tu me parles sur mon programme et donc encore moins pour utiliser les commandes begininvoke etc...je suis un peu perdu là lol
Commenter la réponse de bikini42
bikini42 41 Messages postés jeudi 5 janvier 2006Date d'inscription 11 juin 2010 Dernière intervention - 14 mai 2007 à 10:27
0
Utile
Bonjour Bidou!

Merci de ta réponse! J'ai essayé de modifier comme tu me l'as proposé mais ces timers-là ne permettent pas d'utiliser les Elapsed, Autoreset etc...

Je ne peux donc, apparemment, pas les utiliser, sauf erreur de ma part....
Commenter la réponse de bikini42
bikini42 41 Messages postés jeudi 5 janvier 2006Date d'inscription 11 juin 2010 Dernière intervention - 15 mai 2007 à 13:05
0
Utile
Coucou Bidou!

J'ai mis en place ta proposition, en mettant le nouveau type de Timer que tu me proposais et j'ai effectivement pu trouver le Tick pour remplacer Elapsed, ainsi que start et stop pour gérer le autoreset !!

et bilan des courses.....ça fonctionne parfaitement, sans erreur, sans exception levée !!!!!!

Merci bcp bcp tu m'enlève une grosse épine du pied!

Merci bcp et à charge de revanche (même si je ne vois pas en quoi je pourrais t'aider vues nos différences de nivaux en prog lol)!

;)
Commenter la réponse de bikini42
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 15 mai 2007 à 13:58
0
Utile
Au plaisir ^^

<hr />
-Blog-
Commenter la réponse de cs_Bidou
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 16 mai 2007 à 21:54
0
Utile
Si si il y en a un : avec ce type de Timer, ta méthode OnElapsed s'execute dans un autre thread, pas dans celui d'où tu as lancé le Timer.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.