Pb d'exception InvalidOperationException [Résolu]

Messages postés
41
Date d'inscription
jeudi 5 janvier 2006
Dernière intervention
11 juin 2010
- 11 mai 2007 à 16:10 - Dernière réponse :
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 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 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
14 mai 2007 à 10:11
3
Merci
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-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
15 mai 2007 à 10:24
3
Merci
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-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
12 mai 2007 à 16:33
0
Merci
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
Messages postés
41
Date d'inscription
jeudi 5 janvier 2006
Dernière intervention
11 juin 2010
14 mai 2007 à 09:23
0
Merci
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
Messages postés
41
Date d'inscription
jeudi 5 janvier 2006
Dernière intervention
11 juin 2010
14 mai 2007 à 10:27
0
Merci
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
Messages postés
41
Date d'inscription
jeudi 5 janvier 2006
Dernière intervention
11 juin 2010
15 mai 2007 à 13:05
0
Merci
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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
15 mai 2007 à 13:58
0
Merci
Au plaisir ^^

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
16 mai 2007 à 21:54
0
Merci
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.