Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problema PictureBox
Forum - C# / VB.NET - Problema PictureBox

Avatar
Sparvier0 (Normal User)
Newbie


Messaggi: 19
Iscritto: 25/02/2011

Segnala al moderatore
Postato alle 17:37
Giovedì, 28/04/2011
Salve,

ho il segunete problema:

nel mio applicativo viene lanciato un thread che ogni 5 secondi legge dei dati da una scheda digitale. I dati che mi interessano sono 4 bit che provvedo ad estrarre con un mio metodo, una volta estratto il bit viene confrontato con il valore 0, se il test ha esito positivo viene attivato un evento che deve cambiare lo stato di una PictureBox, cambiando l'immagine della stessa.
Purtroppo quando l'evento viene attivato non accade nulla.
Ho provato ad inserire una messageBox per vedere se l'evento effettivamente viene attivato, ed è così, la messagebox viene mostrata, ciò significa che non ho sbagliato a codificare l'evento.
C'è qualcosa nella picturebox che mi sfugge.


Un pò di codice per capire meglio:

Codice sorgente - presumibilmente C#

  1. // questo metodo gestisce l'evento
  2. public void OnProximityAttivato(object source)
  3.         {
  4.             Image img = Properties.Resources.ResourceManager.GetObject("ProximityAttivo.png") as Image;
  5.  
  6.             switch (VarProg.NumberOfProximityActive)
  7.             {
  8.                 case 1:
  9.                    // PctBoxBanco1.Image = img;
  10.                    // textBox1.BackColor = Color.Green;
  11.                     MessageBox.Show("1");
  12.                     break;
  13.                 case 2:
  14.                    // PctBoxBanco2.Image = img;
  15.                    // textBox2.BackColor = Color.Green;
  16.                     MessageBox.Show("2");
  17.                     break;
  18.                 case 3:
  19.                    // PctBoxBanco3.Image = img;
  20.                    // textBox3.BackColor = Color.Green;
  21.                     MessageBox.Show("3");
  22.                     break;
  23.                 case 4:
  24.                    // PctBoxBanco4.Image = img;
  25.                     // textBox4.BackColor = Color.Green;
  26.                       MessageBox.Show("4");
  27.                     break;



Codice sorgente - presumibilmente C# / VB.NET

  1. public delegate void ProximityEventHandler(object source);




Codice sorgente - presumibilmente C++

  1. public static void CheckProximity()
  2.         {
  3.             Test t = new Test();
  4.             WindowsProximity wp = new WindowsProximity();
  5.             t.EventoProximityAttivato += new ProximityEventHandler(wp.OnProximityAttivato);
  6.  
  7.             bool temp = true;
  8.            
  9.             // Il ciclo esegue una lettura dalla scheda ogni 5 secondi per rilevare la presenza di
  10.             // un proximity attivato
  11.             // Viene impostata a true la variabile VarProg BoolProcimity per il check
  12.             // di avvio del motore
  13.             while(temp){
  14.            
  15.             // Proximity 1 attivato
  16.             if (Support.StatusProximity1() == 0)
  17.             {
  18.                 VarProg.NumberOfProximityActive = 1;
  19.                 VarProg.BoolProximity = true;
  20.                 t.Evento();
  21.                 VarProg.CheckOk = true;
  22.                 return;
  23.             }
  24.  
  25.             // Proximity 2 attivato
  26.             if (Support.StatusProximity2() == 0)
  27.             {
  28.                 VarProg.NumberOfProximityActive = 2;
  29.                 VarProg.BoolProximity = true;
  30.                 t.Evento();
  31.                 VarProg.CheckOk = true;
  32.                 return;
  33.             }
  34.  
  35.             // Proximity 3 attivato
  36.             if (Support.StatusProximity3() == 0)
  37.             {
  38.                 VarProg.NumberOfProximityActive = 3;
  39.                 VarProg.BoolProximity = true;
  40.                 t.Evento();
  41.                 VarProg.CheckOk = true;
  42.                 return;
  43.             }
  44.  
  45.             // Proximity 4 attivato
  46.             if (Support.StatusProximity4() == 0)
  47.             {
  48.                 VarProg.NumberOfProximityActive = 4;
  49.                 VarProg.BoolProximity = true;
  50.                 t.Evento();
  51.                 VarProg.CheckOk = true;
  52.                 return;
  53.             }
  54.  
  55.             Thread.Sleep(5000);
  56.             } //While
  57.         }




Perchè funziona con le MessageBox e non con le PictureBox/TextBox??


Grazie mille

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
2
Down
V
Segnala al moderatore
Postato alle 17:54
Giovedì, 28/04/2011
Se l'evento viene generato da un thread separato, anche il suo gestore viene eseguito in quel thread. Perciò da lì non puoi accedere a un controllo generato dal thread del form principale. Se hai aggiunto un codice che cattura tutte le eccezioni o hai disabilitato l'opzione che la lancia, non vedrai l'eccezione CrossThreadException che molto probabilmente c'è.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM