View Full Version : C# passare delle variabili ad un evento
82_marco
06-08-2012, 22:41
Ciao a tutti,
Sono nuovo del forun,
Il mio problema e' questo: Devo passare 2 variabili ad un evento contenuto in una classe, ma non riesco a capire come fare.
il mio evento e' questo:
private void EventoTimerD(object stateInfo)
{
Diztimer[NumeroTemporizzatore].Dispose();
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "0";
}
L' ambiente di sviluppo dice che DizTimer e NumeroTemporizzatore non esistono nel contesto corrente, per questo vorrei sapere se e' possibile passarle quando dichiaro l' evento, cioe' qua:
System.Threading.Timer timerD = new System.Threading.Timer(EventoTimerD, null, Tempo, Tempo);
o se non e' possibile vorrei sapere come posso fare per togliermi questi errori.
Vi ringrazio per l' aiuto che sicuramente ricevero'
il parametro state del costruttore del timer può essere utilizzato per passare informazioni alla funzione richiamata (il tuo EventoTimerD).
Quindi, invece di utilizzare
System.Threading.Timer timerD = new System.Threading.Timer(EventoTimerD, null, Tempo, Tempo);
dovresti utilizzare
System.Threading.Timer timerD = new System.Threading.Timer(EventoTimerD, TUOOGGETTO, Tempo, Tempo);
con TUOOGGETTO un oggetto che conterrà DizTimer e NumeroTemporizzatore. Infine avrai qualcosa del tipo:
private void EventoTimerD(object stateInfo)
{
TUOOGGETTO state = (TUOOGGETTO) stateInfo;
state.Diztimer[state.NumeroTemporizzatore].Dispose();
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "0";
}
Anche se non è possibile giudicare dalle poche righe di codice riportate, penso (ma potrei sbagliarmi) che sia consigliabile rimuovere il Diztimer[NumeroTemporizzatore] dopo averne fatto il Dispose per non rischiare di farvi riferimento in seguito.
82_marco
07-08-2012, 18:01
Ciao, che tipo di oggetto posso utilizzare per questo scopo?
Cioe' mi puoi mostrare come inseriresti i 2 valori al suo interno?
la mia classe completa e' questa
namespace WindowsFormsApplication1
{
class GestioneTemporizzatori
{
byte[] AppoggioTemporizzatoriC = new byte[1000];
public void GestisciTemporizzatore(char risultato, byte[] AppoggioTemporizzatori, Dictionary<int, System.Threading.Timer> Diztimer)
{
int NumeroTemporizzatore = int.Parse(Form1.RigaDaGestire.Substring(48, 3));
if (risultato == '1' && AppoggioTemporizzatori[NumeroTemporizzatore] == 0)
{
CreaTemporizzatore(Diztimer, NumeroTemporizzatore);
AppoggioTemporizzatori[NumeroTemporizzatore] = 1;
}
else if (risultato == '0' && AppoggioTemporizzatori[NumeroTemporizzatore] == 1)
{
CancellaTemporizzatore(Diztimer, NumeroTemporizzatore);
AppoggioTemporizzatori[NumeroTemporizzatore] = 0;
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "0";
}
}
public void CreaTemporizzatore(Dictionary<int, System.Threading.Timer> Diztimer, int NumeroTemporizzatore)
{
int Tempo = (int.Parse((Form1.RigaDaGestire.Substring(59, 5))) * 1000);
switch (Form1.RigaDaGestire.Substring(54, 1))
{
case "B" :
System.Threading.Timer timerB = new System.Threading.Timer(EventoTimerB, null, Tempo, Tempo);
Diztimer.Add(NumeroTemporizzatore, timerB); // Inserisco il timer in un dizionario in modo da poterlo rintracciare
break;
case "C" :
//AppoggioTemporizzatoriC[NumeroTemporizzatore] = 1;
//Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "1";
//if (AppoggioTemporizzatoriC[NumeroTemporizzatore] == 1)
//{
// System.Threading.Timer timerC = new System.Threading.Timer(EventoTimerC, null, Tempo, Tempo);
// Diztimer.Add(NumeroTemporizzatore, timerC);
//}
break;
case "D" :
System.Threading.Timer timerD = new System.Threading.Timer(EventoTimerD, null, Tempo, Tempo);
Diztimer.Add(NumeroTemporizzatore, timerD);
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "1";
break;
}
}
public void CancellaTemporizzatore(Dictionary<int, System.Threading.Timer> Diztimer, int NumeroTemporizzatore)
{
if (Diztimer.ContainsKey(NumeroTemporizzatore))
{
Diztimer[NumeroTemporizzatore].Dispose();
Diztimer.Remove(NumeroTemporizzatore);
}
}
// Eventi timer
private void EventoTimerB(object stateInfo)
{
//Diztimer[NumeroTemporizzatore].Dispose();
//Diztimer.Remove(NumeroTemporizzatore);
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "1";
}
//private void EventoTimerC(object stateInfo)
//{
// Diztimer[NumeroTemporizzatore].Dispose();
// Diztimer.Remove(NumeroTemporizzatore);
// Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "0";
// AppoggioTemporizzatoriC[NumeroTemporizzatore] = 0;
//}
private void EventoTimerD(object stateInfo)
{
// Diztimer[NumeroTemporizzatore].Dispose();
// Diztimer.Remove(NumeroTemporizzatore);
Form1.Temporizzatori[int.Parse(Form1.RigaDaGestire.Substring(48, 3))] = "0";
}
}
}
Niente di esoterico. Un semplicissimo
class esempio
{
public List<tipo> Diztimer;
public int NumeroTemporizzatore;
public esempio(tipo dizTimer, int numero)
{
this.DizTimer = dizTimer;
this.NumeroTemporizzatore = numero;
}
}
Ovviamente sostituendo a <tipo> il tipo di oggetti contenuti in Diztimer ed eventualmente sostituendo la lista con la struttura dati da te utilizzata
82_marco
07-08-2012, 18:31
aspetta, sto facendo confusione
Sulla classe che ho postato prima dove creo l'oggetto?
Avendo ora il codice la soluzione immediata sarebbe di definire la classe d'esempio, che ti ho riportato prima, all'interno del namespace e, in creaTemporizzatore, scrivere cosi:
System.Threading.Timer timerB = new System.Threading.Timer(EventoTimerB,
new Esempio(DizTimer, NumeroTemporizzatore),
Tempo,
Tempo);
ripetendo l'operazione per C e D
82_marco
07-08-2012, 19:07
Purtroppo adesso mi e' impossibile provare perche' sto partendo per 2 giorni.... appena rientro provo e poi ti dico come va, in tanto ti ringrazio
82_marco
07-08-2012, 23:43
Sembra funzionare :-) grazie di tutto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.