PDA

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'

Dânêl
07-08-2012, 09:13
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";
}
}
}

Dânêl
07-08-2012, 18:23
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?

Dânêl
07-08-2012, 18:53
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