Creare timer personalizzati

giovedì 24 maggio 2012 - 00.14
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio Express

82_marco Profilo | Junior Member

Ciao a tutti, vorrei creare dei timer personalizzati da abilitare quando una variabile vale '1'.
Il timer da come lo immagino io deve essere personalizzabile sulla durata ed andare a settare un valore di un array ad 1 quando ha finito il suo conteggio.

ah dimenticavo, se la variabile di abilitazione da '1' passa a '0' il timer deve resettarsi per ricominciare il suo "dovere" non appena ritornano le condizioni necessarie.

Potete darm dei consigli per favore?
Grazie

pedro8a Profilo | Junior Member

non è molto chiaro quello che chiedi
però in fase di progettazione puoi fare i vari settaggi al timer, come inteval, enable e se metti un contatore all'interno puoi sapere ad ogni giro di timer a che punto sei.
Il contatore lo incrementi o decrementi, dipende cosa ti serve.
quando il contatore è a un certo valore disabiliti/abiliti il timer.
Ovviamente la variabile del contatore deve essere almenno a livello di form

________________________
Pedro8a
Sviluppo per passione

82_marco Profilo | Junior Member

io volevo creare un metodo timer da richiamare quando un operazione booleana e' true, tramite file di configurazione vorrei impostare il tempo di ciascun timer (ne vorrei attivare anche molti simultaneamente) e poi quando il conteggio e' finito deve settare un array all indirizzo specificato dal file, in modo che su un altra riga di questo file dico al programma d andare a vedere l'array e se vale 1 gli faccio compiere un operazione.

cmq questo lo gestisco dopo, l'importante adesso e' creare questo metodo timer da impostare da file. come base dei tempi ho pensato di usare un timer del form, e da questo ad ogni tick vado a decrementare o incrementare (dipende da cosa decido sul file) gli altri timer, cosa ne pensi?

pedro8a Profilo | Junior Member


I timer possono essere creati a runtime, parliamo di .net?
Puoi memorizzare/recuperare le info in un file XML, semplice da gestire

io volevo creare un metodo timer da richiamare quando un operazione booleana e' true, tramite file di configurazione vorrei impostare il tempo di ciascun timer (ne vorrei attivare anche molti simultaneamente) e poi quando il conteggio e' finito deve settare un array all indirizzo specificato dal file, in modo che su un altra riga di questo file dico al programma d andare a vedere l'array e se vale 1 gli faccio compiere un operazione.

cmq questo lo gestisco dopo, l'importante adesso e' creare questo metodo timer da impostare da file. come base dei tempi ho pensato di usare un timer del form, e da questo ad ogni tick vado a decrementare o incrementare (dipende da cosa decido sul file) gli altri timer, cosa ne pensi?





________________________
Pedro8a
Sviluppo per passione

82_marco Profilo | Junior Member

Ciao, lo vorrei creare in c#..... per la configurazione userei un file txt che uso gia' all interno del programma per "istruire" il funzionamento del programma....

82_marco Profilo | Junior Member

Ciao ho ipotizzato questo frammento di codice
Dove rigadagestire e' ricavara da un file txt che contiene molte altre istruzioni, ma che nel momento in cui viene richiamato il metodo contiene tutti i dati necessari al suo funzionamento

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

l'unica cosa che mi manca e' come fare l'incremento di contasecondi al di fuori di questo metodo (in modo da contare esattamente i secondi passati e come fare per eseguire piu' volte contemporaneamente questo metodo (gestendo un altro temporizzatore, ho ipotizzato di usare 1000 temporizzatori)

qualche aiutino?

pedro8a Profilo | Junior Member

Premesso che C# non lo conosco, comunque contasecondi deve essere un metodo pubblico della classe Temporizzatori
In questo modo puoi gestire "contasecondi" da dove istanzi la classe.
All'interno della classe lo incrementi di n e all'esterno controlli a che puntp è.

Puoi istanziare quante volte vuoi la classe, quindi n temporizzatori.

Certo qualcuno più esperto di me ti potrà aiutare meglio.

Ma cosa devi fare?

Ciao

________________________
Pedro8a
Sviluppo per passione

82_marco Profilo | Junior Member

vorrei provare a creare una specia di supervisore personalizzabile, in un file di testo scrivo cosa voglio che faccia e lui richiama la classe idonea all operazione da svolgere. il temporizzatore e' una di queste funzioni

l'incremento vorrei fosse reale, e' possibile avere una base dei tempi di un secondo o anche mezzo con cui eseguire l' incremento di ogni temporizzatore richiamato?

pedro8a Profilo | Junior Member

Scusami, ma non capisco bene cosa vuoi fare. Qualcuno più bravo (e ce ne sono moooolti) ti darà migliori spiegazioni.
Come intervallo, nella classe timer, devi mettere i millisecondi, quindi 500 millisec=1/2 secondo.
Ad ogni "giro" (tick) di timer, incrementi decrementi una ipotetica variabile pubblica/privata della classe.

________________________
Pedro8a
Sviluppo per passione

Vinsent Profilo | Senior Member

>ho ipotizzato
>di usare 1000 temporizzatori)

1000mila!!! ....mi sembrano tantini...sei sicuro che sia la soluzione migliore?
Tutto quello che c' è da sapere sul Timer è qui:
http://msdn.microsoft.com/it-it/library/system.timers.timer.aspx
se non ti "quadra" qualcosa chiedi...
Per il resto e solo una questione di "incastrare" variabili, condizioni ed eventi in base alle tue necessità...

82_marco Profilo | Junior Member

Si sono tantini :-), ma dubito che li usero' tutti... ma visto che ci sono :-)

Li chiamo io timer, ma sono solo delle variabili da incrementare ogni secondo e che al raggiungimento di un setpoint dato da file di configurazione mi mandino a "1" un elemento di un array.....

sono bloccato perche' non riesco a concepire come far partire piu' di uno dei metodi che ho postato sopra e come faccio a dare il clock ad essi in modo che eseguano gli incrementi.... ad dimenticavo, dovrebbero fare il loro compito autonomamente una volta lanciati, non devono fermare il mio programma per la loro esecuzione (tipo dei background worker)...

Vinsent Profilo | Senior Member

>Si sono tantini :-), ma dubito che li usero' tutti... ma visto
>che ci sono :-)
>
>Li chiamo io timer, ma sono solo delle variabili da incrementare
>ogni secondo e che al raggiungimento di un setpoint dato da file
>di configurazione mi mandino a "1" un elemento di un array.....
>
>sono bloccato perche' non riesco a concepire come far partire
>piu' di uno dei metodi che ho postato sopra e come faccio a dare
>il clock ad essi in modo che eseguano gli incrementi.... ad dimenticavo,
>dovrebbero fare il loro compito autonomamente una volta lanciati,
>non devono fermare il mio programma per la loro esecuzione (tipo
>dei background worker)...

Un timer è un Timer...
Una variabile è una Varaiabile...
Un clock...boooo
Se chiami Cane il Gatto o hai un gatto e un cane e li chiami entrambi "Adriano"...non si capisce di che animale stai parlando...

Interpretando...penso...che vuoi un, chiamiamolo Controllore, che in base a certe condizioni avvia o ferma dei "Sub Controllori" che in base a certe condizioni scatenano degli "eventi".
Le "condizioni" che attivano i controllori sono riconducibili ad un' evento?

82_marco Profilo | Junior Member

le condizioni che scatenano il controllo sono delle variabili, in una parte del mio codice eseguo dei controlli su delle schede collegate in seriale, se rispettano certe condizioni che vado a decidere in un file txt vanno ad eseguire delle operazioni che decido sempre nello stesso file.... un di queste operazioni io la chiamo temporizzatore... in una riga del file dichiaro le condizioni necessarie al avvio del temporizzatore, il tempo e che elemento della lista deve mettere a 1 allo scadere del tempo..... ho gia' fatto eltre operazioni seguendo questa logica, ma non riesco a sistemare il temporizzatore.
Per clock intendevo un qualcosa unico per tutti i timer in funzione che mi vada a scandire i secondi in modo che i miei temporizzatori possano contare.

Se ti e' utile per chiarire il funzionamento possiamo anche sentirci in skype o magari fare una sessione remota su teamwiewer e poi aggiorniamo il post con le nostre considerazioni

Vinsent Profilo | Senior Member

Preferisco non entrare nel merito del tuo programma, anche perchè mi sono accorto che è in C#...io conosco vb.net...
Comunque, per:
>Le "condizioni" che attivano i controllori sono riconducibili ad un' evento?
intendevo chiederti se hai già scritto il codice che verifica le condizioni per avviare il timer/temporizzatore, da quanto ho capito si.
Quindi, penso, puoi creare un Timer personalizzato o usercontrol, in pratica una classe derivata da Timer.
L' esempio sotto è in vb ma penso sia chiaro il concetto di base.
Al Timer di "base" ho aggiunto la "proprietà" 'limite', l' evento 'limite_raggiunto' e una variabile 'contatore'.
Per avviare il timer, ad esempio, da form con il click di un button:
Private Sub Button1_Click() Handles Button1.Click Mio_timer1.Interval = 1000 Mio_timer1.limite = 10 Mio_timer1.Start() End Sub
dove 'interval' è l' intervallo in millisecondi e 'limite' è il valore da confrontare con quello di 'contatore'.
La classe dell usercontrol:
Public Class mio_timer Inherits Timer Private limite_1 As Integer Private contatore As Integer Property limite() As Integer Get Return limite_1 End Get Set(ByVal Value As Integer) limite_1 = Value End Set End Property Private Sub me_tick() Handles Me.Tick contatore = contatore + 1 If contatore = limite_1 Then contatore = 0 RaiseEvent limite_raggiunto() End If End Sub Public Event limite_raggiunto() End Class
All' evento 'Tick' 'contatore' viene incrementato di 1 e se l' IF è True il contatore si azzera e si scatena l' evento 'limite_raggiunto'.
In pratica ogni dieci secondi si avvia l' evento 'limite_raggiunto' che può essere intercettato come qualsiasi altro "evento":
Private Sub fai_questo() Handles Mio_timer1.limite_raggiunto End Sub
Ti serve qualcosa del genere?







82_marco Profilo | Junior Member

Si :-), questa e' una delle funzioni che vorrei implementare... :-) l'evento che lancia il timer e' una variabile che se vale 1 lo fa partire, ma se torna a 0 deve farlo fermare

Vinsent Profilo | Senior Member

>Si :-), questa e' una delle funzioni che vorrei implementare...
Beccato...

>l'evento che lancia il timer e' una variabile che se vale
>1 lo fa partire, ma se torna a 0 deve farlo fermare
Qui invece non ci capiamo...l' "evento" non è la variabile in se stessa ma ciò che la cambia, o la verifica su di essa generata sempre attraverso un evento.
in teoria sarebbe corretto usare una Boolean(true/false), comunque, quando modifichi tale variabile basta che scrivi un IF che controlla il suo valore e in base al risultato esegui le operazioni del caso.

82_marco Profilo | Junior Member

Esatto :-) purtropo non sono ancora riuscito a provare a creare il metodo,

Ti posto un pezzo di codice che ho creato per gestire gli altri elementi, cosi mi spiego meglio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


la variabile risultato e' quella che scatena l'esecuzione dell elemento, ora dev ousare questa variabile anche per fare partire il temporizzatore voluto..

spero che con ques oesempiosia riuscito a spiegarmi meglio....

Vinsent Profilo | Senior Member

>Ti posto un pezzo di codice che ho creato per gestire gli altri
>elementi, cosi mi spiego meglio:
...non conosco C#....

>la variabile risultato e' quella che scatena l'esecuzione dell
>elemento, ora dev ousare questa variabile anche per fare partire
>il temporizzatore voluto..
...la variabile "risultato" può solo cambiare valore, nient' altro!!!
L' esecuzione "dell' elemento" si avvia in base alla "VERIFICA" del valore della variabile:

IF risultato = 1 THEN fai questo
IF risultato = 0 THEN fai quest' altro

quindi puoi fare partire il Timer nello stesso punto o allo stesso modo.
Per fermarlo, in qualche punto del tuo codice, ci dovrebbe essere una routine che modifica il valore della variabile, subito dopo la modifica rifai il controllo:

risultato = 0
IF risultato = 0 THEN timer.stop

il tutto si riduce, come concetto basilare, A:
EVENTO > MODIFICA DELLA VARIABILE > CHECK SUL VALORE DELLA VARIABILE > AZIONE IN BASE AL CHECK
banalmente....:
Dim risultato As String Private Sub Button1_Click() Handles Button1.Click risultato = 0 verifica_esegui() End Sub Private Sub Button2_Click() Handles Button2.Click risultato = 1 verifica_esegui() End Sub Private Sub verifica_esegui() If risultato = 0 Then 'operazioni del caso End If If risultato = 1 Then 'operazioni del caso End If End Sub

>spero che con ques oesempiosia riuscito a spiegarmi meglio....
...non conosco C#....

82_marco Profilo | Junior Member

>L' esecuzione "dell' elemento" si avvia in base alla "VERIFICA"
>del valore della variabile:
>
>IF risultato = 1 THEN fai questo
>IF risultato = 0 THEN fai quest' altro
>

Esattamente :-)

Spero di riuscire a cominciare le mie prove questa sera, ti tengo aggiornato

82_marco Profilo | Junior Member

Ciao, purtropo dho delle difficolta' sulla scrittura del codice :-(
Adesempio la dichiarazione del nome del timer la dovrei fare da file di configurazione, e' possibile?

Vinsent Profilo | Senior Member

>Ciao, purtropo dho delle difficolta' sulla scrittura del codice
>:-(
>Adesempio la dichiarazione del nome del timer la dovrei fare
>da file di configurazione, e' possibile?
Non so, aldilà che Timer non ha la proprietà "nome"...ho notato che non viene "conteggiato" come controllo...e adesso non ho tempo di approfondire la questione...
Comunque, puoi sempre aggiungere la proprietà "nome" al Timer prendendo come esempio la proprietà "limite" del codice che avevo postato.

82_marco Profilo | Junior Member

Ciao, Ho buttat ogiu' un poco di codice, ma mi sono perso in una cosa semplicissima ma che non riesco a risolvere :-(

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Nell evento TimerEventProcessor devo dichiarare Temporizzatori e RigaDaGestire, ma non riesco a farlo, so che e' una cavolata, ma non mi viene in mente come farlo :-( un aiutino per favore?

In oltre Mi e' stato consigliato di lavorare on variabili di istanza, perche' quelle che sto usando io sono statiche e non vanno bene per l'uso multiplo della classe.... qualche consiglio?

82_marco Profilo | Junior Member

Sono bloccato :-(

Vinsent Profilo | Senior Member

>Ciao, Ho buttat ogiu' un poco di codice, ma mi sono perso in
>una cosa semplicissima ma che non riesco a risolvere :-(

>Nell evento TimerEventProcessor devo dichiarare Temporizzatori
>e RigaDaGestire, ma non riesco a farlo, so che e' una cavolata,
>ma non mi viene in mente come farlo :-( un aiutino per favore?

Qui, forse posso aiutarti...nel senso che stò "accrocchiando" del codice per gestire i Timer creati a runtime usandone la proprietà "nome"...vedi mio post precedente...se ho tempo domani ti posto un' esempio in VB, spero, funzionante...

>In oltre Mi e' stato consigliato di lavorare on variabili di
>istanza, perche' quelle che sto usando io sono statiche e non
>vanno bene per l'uso multiplo della classe.... qualche consiglio?

Qui, non ho la più idea di cosa stai parlando.............

82_marco Profilo | Junior Member


>Qui, forse posso aiutarti...nel senso che stò "accrocchiando"
>del codice per gestire i Timer creati a runtime usandone la proprietà
>"nome"...vedi mio post precedente...se ho tempo domani ti posto
>un' esempio in VB, spero, funzionante...

Grazie :-)

Dicono di usare delle variabili di istanza perche questa classe timer e' possibile che sia richiamata anche mentre e' gia' in funzione, cioe' puo' essere che nel mio file di configurazione vadi a richiamare un timer di 60 secondi, e nell istruzione successiva ne vada a chiamare un altro di 10, ma quest' ultimo deve partire subito e non aspettare che finisca il primo. non so se sono riuscito ad essere chiaro, ma spero di si

Vinsent Profilo | Senior Member

Ho impiegato più tempo del previsto...per applicare la teoria alla pratica...e per il poco tempo.
Il progetto in allegato, in vb.net, è incompleto e penso sia un' accrocchio...vedi tu se ne ricavi qualcosa di utile....

82_marco Profilo | Junior Member

Ciao, non ho l'ambianete di sviluppo per visualbasic :-( come posso fare per aprirlo?

Vinsent Profilo | Senior Member

Tranne installare VS2010 per VB non saprei...
Comunque nella cartella Debug c' è l' exe, così puoi vedere il funzionamento. Mentre per il codice ti basta aprire i file con estensione .vb con il Blocco Note.

82_marco Profilo | Junior Member

ok grazie :-) adesso ci do un okkiata :-)

82_marco Profilo | Junior Member

Ciao, sono riuscito a creare il timer, adesso dovrei eliminarlo quando non sono piu' vere le condizioni che lo hanno creato. come posso fare?
ecco il mio timer

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

adesso se risultato = 0 devo distruggerlo

82_marco Profilo | Junior Member

Ciao, sono riuscito a crearlo :-)
Se vi interessa vi posto come ho risolto il caso

82_marco Profilo | Junior Member

Ciao a tutti... sono ancora alle prese con questi maledetti timer. il mio problema e' che quando lancio in esecuzione un timer questo deve funzionare indipendentemente dal funzionamento del rest odel programma.... avete qualche consiglio? io avev opensato di creare un thread per ogni timer avviato, vi sembra la soluzione migliore?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5