timer in webapp lato server

ciao, ho gi letto la discussione sul forum generale, ma non riesco…

in pratica ho una webapp standalone che all’apertura deve far partire un timer (ogni minuto controllo l’ora, se coincide con i miei parametri, devo aggiornare il db)

all’inizio avevo messo il timer sulla webpage di apertura (login) ma non va bene, vorrei fosse inizializzato alla open della webapp (quindi senza aprire browser)

ho creato una property public nella app, che ho chiamato ImportTimer1 di tipo timer (il mio timer)

quando per nella open dichiaro

dim importTimer1 as importTimer
importTimer1.enabled=true

ritorna un nil object exception…

Ciao Ciro,
molta confusione.

Dichiarazione della variabile
Dim importTimer1 As ImportTimer -> dichiara importTimer1 del tipo importTimer ma non crea un’istanza della classse importTimer
Dim importTimer1 As New ImportTimer -> dichiara importTimer1 del tipo importTimer creando un’istanza della classse importTimer
Dim importTimer1 As importTimer = New ImportTimer -> esattamente come l’istruzione precedente.

Vita e visibilita’ della variabile
Avendo scritto “dim importTimer1” nel metodo open hai creato una variabile locale al metodo open che scomparira’ al termine del metodo open stesso e che non ha nulla a che vedere con la property della app.

Nel metodo open per creare il timer devi semplicemente scrivere:
importTimer1 = new Timer
in quanto importTimer1 e’ gia’ definita come proprieta’ della app ed e’ dichiarata di tipo Timer.

Saluti.

La spiegazione di Maurizio chiara.
Ciro, ora sei riuscito a implementarla?

grazie, innanzitutto auguri a tutti,

nel post pranzo natalizio ci provo e vi aggiorno…

non mi chiara per una cosa…

avendo definito io una classe importtimer con i suoi eventi (action) e metodi (la procedura di import che deve essere eseguita), vorrei che il timer che lancio alla open dell’app utilizzi proprio questi…

ciao

allora, ho provato a mettere nella open dell’app

importtimer1=new importtimer (mia classe con eventi - action - e parametri corretti)

per mi restituisce il seguente errore:

“control cannot be created because no session context is available. Create a websessioncontext obkect”

Ciao Ciro,
che tipo di Timer stai utilizzando?

Dal tipo di errore direi che stai utilizzando un WebTimer,
ma quando devi utilizzare un timer lato Server cio se deve partire all’open dell’app devi utilizzare un Timer non un WebTimer.

Esatto. Un webTimer gira sul client, a te serve un timer sul server, quindi un timer normale

avete ragione un web timer…

quindi lo definisco come timer e provo

grz

allora, adesso errori non ne d pi (ho definito il mio oggetto importtimer come timer e non webtimer),

dopo nella open dell’app ho messo

importtimer1=new importtimer
importtimer1.period = 60000
importtimer1.enabled = true

tuttavia, non sembra che faccia nulla. Ricordo che ho l’evento action definito in importtimer (non so come metterlo su importtimer1, non ne ho la possibilit) cosi come nei metodi ho la routine che deve aggiornare il db…

credo manchi l’ultimo tassello…

ricapitoliamo:
hai definito una propriet dell’app importtimer1 as importtimer? (altrimenti esce di scopo)
Non hai definito (anche) una variabile importtimer1 as importtimer (altrimenti assegni a questa e esce di scopo)

Nell’oggetto importtimer hai definito l’evento action (lo puoi implementare, non necessario che sia in una finestra/pagina, vuol dire che tutte le istanze richiamano lo stesso codice )?

allora:

ho definito un oggetto importtimer di tipo timer (per intenderci nell’albero a sx dove ci sono tutte le entit)
quest’oggetto ha eventi (action) e metodi (import_dati_db)
l’ho definito come trascinandolo dagli oggetti disponibili (non legato ad alcuna web page) selezionando il webtimer e poi cambiando nell’inspector a timer

per intenderci, il mio import timer sarebbe come il customtimer qui: (no customtimer1!)

nell’evento open dell’app, ho creato un oggetto importtimer1 che vorrei facesse le cose di importtimer
importtimer1 una property con visibilit public (ha l’icona con un cubo blu), non ci sono variabili che si chiamano importtimer1

sempre nella open dell’app ho impostato il periodo e fatto partire il timer (enabled=true)

Ok
Hai dichiarato che customTimer (usando l’immagine come esempio) una classe che deriva da Timer.
Bene
Ora con il tasto destro aggiungi l’handler per action (nella classe) esattamente come quando lo fai per l’istanza nella finestra (come faresti su customTimer1)
E allo stesso modo metodi e propriet della classe.
(non essendoci il triangolo deduco che non hai creato nulla di queste cose, altrimenti posta l’immagine della classe importTimer)

bene, sono riuscito a fare degli screenshot della situazione reale, in modo che sia più chiaro…

oggetto importtimer dichiarato, con i suoi metodi e proprietà ed evento action

property importtimer1 public dichiarata nell’app

evento open dell’app

Mi sembra tutto ok
presumo che nell’action dell’oggetto ci sia la chiamata al metodo import
Come fai a dire che non viene chiamato?
Per verificare puoi mettere un period più basso e invece che richiamare import chiami system.debuglog “TimerAction”
Lanci l’applicazione dall’ide vedi se nel panel dei log appare la chiamata.
Se appare (come come deve fare) la scritta TimerAction vuol dire che la chiamata la fa e il problema è altrove. Altrimenti c’è qualcosa di strano

ciao Antonio, niente non fa mai l’evento action

suppongo il pannello cui tu ti riferisci quello dei messages…cmq non appare nulla (a parte miaapp.exe launched)

a questo punto ci sar qualche altro problema…

cmq questo quello che avevo messo nell’action in origine

		Dim orario,OraSync1,OraSync2 as string
		
		'Dim db As New MySQLCommunityServer
		Dim db As New MSSQLServerDatabase
		
		db.Host =RipaB2B.host // or just the IP if using the default instance
		'db.port = 3306
		db.DatabaseName = RipaB2B.dbnm
		db.UserName = RipaB2B.user  // or "Domain\\UserID for trusted domain accounts
		db.Password = RipaB2B.pass
		
		If db.Connect Then
				'Dim ps As MYSQLPreparedStatement
				Dim ps As MSSQLServerPreparedStatement
				
				Dim stringa_sql as string
				Dim rs As RecordSet
				stringa_sql = "select OraSync1,OraSync2 from parametri where IdParam='EMMECI'"
				ps = db.Prepare(stringa_sql) 
				rs=ps.SQLSelect
				if rs <> Nil Then
						While Not rs.EOF
								OraSync1=rs.IdxField(1).StringValue
								OraSync2=rs.IdxField(2).StringValue
								rs.MoveNext
						Wend
						rs.Close
				end if
				Dim d As New Date
				if d.Hour < 10 then
						orario="0"+Str(d.Hour)
				else
						orario=Str(d.Hour)
				end if
				orario=orario+":"
				if d.Minute < 10 then
						orario=orario+"0"+Str(d.Minute)
				else
						orario=orario+Str(d.Minute)
				end if
				'msgbox(orario.ToText)
				if orario=OraSync1 or orario=OraSync2 then
						'me.Enabled=false
						Import
						'me.Enabled=true
						'msgbox(orario.ToText)
				end if
		Else
				MsgBox("Connection error:" + db.ErrorMessage)
		End If
		

manca una cosa fondamentale…
ImportTimer1.period=60000
ImportTimer1.mode=Timer.ModeMultiple //Altrimenti off di default

Poi nella procedura chiamata devi cambiare qualcosa…
I msgbox non vanno bene. A chi li mostri se stai lavorando a livello di app?
Magari metti un system.debuglog per leggere il messaggio e usa un flag per poter vedere lato utente web lo stato

in realt li uso per fare debug, infatti sono commentati

facevo cosi anche per vfp visto il poco feeling con il debug di serie…

Si immagino e mi ricordo…
In ogni caso qui, almeno in debug utilissimo, Poi nella realt dipende dal Sistema operativo e per semplicit mi creo un mio file di log vicino all’applicazione (o nel primo luogo scrivibile disponibile)

Comunque indicando il mode al timer risolvi tutto.

purtroppo non si verifica l’evento

provato lanciando app dal run dell’ide (no build)

pu essere qualcosa legato a come stato creato importtimer? io ho trascinato il timer dalla library e poi ho modificato la propriet super da webtimer a timer