Pb d'exception InvalidOperationException

Résolu
bikini42 Messages postés 41 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 11 juin 2010 - 11 mai 2007 à 16:10
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre 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
A voir également:

8 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
14 mai 2007 à 10:11
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-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
15 mai 2007 à 10:24
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-
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
12 mai 2007 à 16:33
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
*/
0
bikini42 Messages postés 41 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 11 juin 2010
14 mai 2007 à 09:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bikini42 Messages postés 41 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 11 juin 2010
14 mai 2007 à 10:27
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....
0
bikini42 Messages postés 41 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 11 juin 2010
15 mai 2007 à 13:05
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)!

;)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
15 mai 2007 à 13:58
Au plaisir ^^

<hr />
-Blog-
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
16 mai 2007 à 21:54
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
*/
0
Rejoignez-nous