Esecuzione di funzioni ad ore pianificate

sabato 08 settembre 2007 - 08.39

amartya Profilo | Junior Member

Ciao a tutti,
Ho sto per finire un'applicazione in VB.Net, questa applicazione svolge diverse funzioni che sono lanciate da un command button.
Io vorrei invece una volta lanciata l'applicazione che le stesse funzioni venissero lanciate ad ore prefissate.
Ad esempio vorrei che la funzione che consente di connettere l'applicazione ad un server remoto fosse lanciata alle 12,00.
Come posso fare?
Non ho mai fatto nulla del genere potreste darmi un esempio?
Vi ringrazio tutti
Amartya

SSUPERPIPPO Profilo | Guru

>Ciao a tutti,

Ciao

>Ho sto per finire un'applicazione in VB.Net, questa applicazione svolge diverse funzioni che sono lanciate da un command button.
>Io vorrei invece una volta lanciata l'applicazione che le stesse funzioni venissero lanciate ad ore prefissate.
>Ad esempio vorrei che la funzione che consente di connettere l'applicazione ad un server remoto fosse lanciata alle 12,00.
>Come posso fare?
>Non ho mai fatto nulla del genere potreste darmi un esempio?

Devi inserire un timer nella tua applicazione ed associare al suo evento tick un' istruzione che controlli il raggiungimento dell'orario stabilito.
Chiaramente all'avvio del tuo applicativo dovrai richiamare il metodo Start del tuo Timer.

Spero di essermi spiegato, se non riesci fammi sapere che ti posto un pò di codice...

>Vi ringrazio tutti
>Amartya

Di nulla, ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

amartya Profilo | Junior Member

Alessandro grazie per la risposta, ho già inserito un timer ed associato al timer un tick ed al tick un evento.
Questo evento si chiama Now() e mi funziona, tuttavia lo stesso evento che fra l'altro ho trovato in un'altro post mi da anche il giorno, io vorrei che mi dasse solo l'ora, così che posso impostare un controllo if che quando fa un match tra l'ora corrente e quella predefinita fa un call alla funzione. (Sono stato lungo ma il codice è esemplificatore) In pratica voglio un formato che mi dia solo l'ora.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Si può impostare il format con solo HH:mm:ss?
Grazie ancora
Amartya

amartya Profilo | Junior Member

Ho provato funziona quel format adesso devo provare a impostare il controllo if che ti dicevo.
Una cosa, se io ho una funzione che si attiva sotto un command button, posso impostare un controllo del tipo:

if tim1 = "16,00,00" then Call Button1_Click(Nothing, Nothing) else End if

Che mi attiva appunto il command button che esegue la funzione predetta.
Grazie ancora
Amartya

SSUPERPIPPO Profilo | Guru

>Ho provato funziona quel format adesso devo provare a impostare il controllo if che ti dicevo.
>Una cosa, se io ho una funzione che si attiva sotto un command button, posso impostare un controllo del tipo:


>if tim1 = "16,00,00" then
>Call Button1_Click(Nothing, Nothing)
>else
>End if

>Che mi attiva appunto il command button che esegue la funzione predetta.
>Grazie ancora
>Amartya

Scusa ma perchè non crei una subroutine da richiamare? E se ti serve anche il CommandButton richiami la stessa subroutine all'evento click...


http://blogs.dotnethell.it/alebadalin

amartya Profilo | Junior Member

Ciao Alessandro, scusa l'ignoranza ma ho sempre sentito dire della subrutine ma non so cosa sia esattamente.
Invece ho provato il codice sotto e funziona perfettamente:

If txtEndDateTime.Text = Format("13:57:00") Then Call cmdConnect_Click(Nothing, Nothing) End If

Ho messo questo codice all'interno dle tiker e funziona perfettamente

Potresti cmq fare un esempio di subrutine
Amartya

amartya Profilo | Junior Member

oh, oh, piccolo problema quando si avvia l'esecuzione della funzione alla data stabilita, la funzione prevede che venga dato l'ok a determinati parametri che sono allocati in un'altra form, insostanza devo premere il command button ok.
Questa form mi appare tramite uno show dialogue quindi fa un check se è stato premuto ok e quindi avvia la funzione.
Il problema sta nel fatto che devo premere un'altro pulsante attraverso un comando pianificato.
Per capire meglio posto il codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Qualche dritta???
Grazie ancora
Amartya

SSUPERPIPPO Profilo | Guru

Se non ho capito male il tuo pulsante avvia l'apertura di una finestra di un'altra form che tu hai chiamato m_dlgConnect . Rimane poi in attesa che venga premuto il pulsante OK.

Una soluzione potrebbe essere questa:

1. Sposti il codice associato all'evento click in una nuova Subritine che chiameremo Esegui, alla quale passerai un parametro di tipo boolean (True/False) che chiameremo Automatico:

Sub Esegui(Automatico as Boolean)

m_dlgConnect.ShowDialog(Automatico)
' Qui c'è il problema
If m_dlgConnect.ok Then
With m_dlgConnect
Call Tws1.connect(.hostIP, .port, .clientId)
Dim msg As String
msg = "Connected to TWS server version " & Tws1.serverVersion() & _
" at " & Tws1.TwsConnectionTime()
txtServerResponses.Text = msg
End With
End If

End Sub

2. All'evento click del button, inserisci questo codice:

Call Esegui(False)

3. All'evento tick, al posto di richiamare l'evento click del button come facevi tu, scriverai:

Call Esegui(True)

4. Nel Form m_dlgConnect dichiari una variabile a livello di Form di tipo Boolean che chiameremo Auto:

Dim Auto as Boolean

5. Modifichi il costruttore (metodo New della classe m_dlgConnect) aggiungendo un parametro di tipo Boolean che chiamerai sempre Automatico:

Public Sub New(Automatico as Boolean)

' Chiamata richiesta da Progettazione Windows Form.
InitializeComponent()

Auto=Automatico <== Auto assumerà True la subroutine viene richiamata dal timer, False se richiamata dal pulsante

End Sub

6. Ora modifichi l'evento Load sempre del form m_dlgConnect aggiungendo queste istruzioni:

If Auto=True then

Me.DialogResult = Windows.Forms.DialogResult.OK
me.close

end if

Così dovrebbe funzionare.

Sicuramente ci sono altre soluzioni ma bisognerebbe com'è strutturato il progetto e cosa deve fare...

Prova e fammi sapere,

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

amartya Profilo | Junior Member

Grazie Alessandro, ho visto che hai inserito un bel po di roba, mi sto mettendo a leggerla.
Speriamo bene
Ti faccio sapere
Grazie ancora
Amartya

amartya Profilo | Junior Member

Scusami Alessandro ho quasi completato di inserire le tue istruzioni , non ho ben capito due cose la prima è dove inserire
Call Esegui(Falso) tu dici al posto dell'evento clik, ma quale visto che li ho eliminati entrambi. Io comunque lo ho inserito nella parte del codice subito dopo quella dove ho scritto "Qui c'è il problema".
Il secondo quesito è invece relativo all'evento load, che io non ho in m_dlgConnect, se ipotizziamo lo creo lo associo alla MainForm oppure al form m_dlgConnect.
Potrò aver scritto anche cavolate ma non sono un'esperto, anche se sto imparando.
Grazie ancora
Amartya

amartya Profilo | Junior Member

Mi da due messaggi di errore il primo in corrispondenza di:
Private m_dlgConnect As New dlgConnect
Errore : Argument non specified for parameter Automatico ofPublic Sub New (Automatico as Boolean)
il secondo di:
m_dlgConnect.ShowDialog(Automatico)
Errore:
Value of type boolean cannot be converted to 'System.Windows.Forms.IWIni.32Window'

Mentre il codice che ho scritto seguendo le tue indicazioni è nella MainForm:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Mentre nel form dlgConnect ho inserito

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Penso di aver detto tutto.
Ti ringazio comunque tantissimo
Amartya

SSUPERPIPPO Profilo | Guru

>Mi da due messaggi di errore il primo in corrispondenza di:
>Private m_dlgConnect As New dlgConnect
>Errore : Argument non specified for parameter Automatico ofPublic Sub New (Automatico as Boolean)

Quando dichiari l'oggetto devi passare al costruttore il parametro booleano... quindi l'istruzione corretta è:

Private m_dlgConnect as New dlgConnect(Auto)

>il secondo di:
>m_dlgConnect.ShowDialog(Automatico)
>Errore:
>Value of type boolean cannot be converted to 'System.Windows.Forms.IWIni.32Window'

Effettivamente qui ho sbagliato io perchè il parametro lo abbiamo già passato prima al costruttore... quindi l'istruzione corretta è:

m_dlgConnect.ShowDialog()

Ora veniamo al codice che hai scritto:


> Public Sub Esegui(ByVal Automatico As Boolean)

> m_dlgConnect.ShowDialog(Automatico)

E qui va bene

> Call Esegui(False)

L'istruzione Call Esegui(False) richiama la stessa SubRuoutine creando un ciclo perpetuo quindi non va bene!
La devi inserire nell'evento click del tuo CommandButton. Basta che fai doppio click sul tuo controllo Button e ti viene aperta la parte di codice relativa proprio all'evento click (che è quello predefinito!). E' proprio lì che devi inserire questo codice.

> If m_dlgConnect.ok Then
> With m_dlgConnect
> Call Tws1.connect(.hostIP, .port, .clientId)
> Dim msg As String
> msg = "Connected to TWS server version " & Tws1.serverVersion() & _
> " at " & Tws1.TwsConnectionTime()
> txtServerResponses.Text = msg
> End With
> End If

>End Sub

Il resto va bene!

>'quindi nel tick event

> Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> '//Qua piazzi il codice da eseguire


> ElseIf txtEndDateTime.Text = Format("19:00:00") Then
> Call Esegui(True)

> End If

> End Sub

E qui va bene!

Fammi sapere se ti è chiaro...

>Ti ringazio comunque tantissimo
>Amartya

di nulla, ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

amartya Profilo | Junior Member

Ciao Alessandro, allora grazie alle tue indicazioni gli errori sono scomparsi.
Quindi ho impostato un tempo per l'operazione pianificata, ed al suo scadere si è aperto il form dlgConnect.
Tuttavia lo stesso non si chiude ma rimane aperto così che le informazione che deve passare restano in stand-by, mi sono anche accordo che se chiudo la form senza passare da ok, cioè premendo il pulsante x, le informazioni passano comunque.
Ho visto il tuo codice credo che il problema sia in:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Cioè non passa l'istruzione relativa all'accettazione dei componenti e relativa chiusura del form dlgConnect quando Auto è True.
Non so cosa possa essre, sto riflettendo pure io.
Grazie cmq
Amartya

SSUPERPIPPO Profilo | Guru

Il problema è qui:

> Public Sub Esegui(ByVal Automatico As Boolean)

In questo punto devi inserire la dichiarazione del Form m_dlgConnect in questo modo

Private m_dlgConnect As New dlgConnect(Automatico)

togliendo l'istruzione da dove attualmente l'hai posizionata.

> m_dlgConnect.ShowDialog()
> Call Esegui(False)
> ' Qui c'è il problema
> If m_dlgConnect.ok Then
> With m_dlgConnect
> Call Tws1.connect(.hostIP, .port, .clientId)
> Dim msg As String
> msg = "Connected to TWS server version " & Tws1.serverVersion() & _
> " at " & Tws1.TwsConnectionTime()
> txtServerResponses.Text = msg
> End With
> End If

> End Sub

Prova, dovrebbe andare tutto.

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

amartya Profilo | Junior Member

Grande Alessandro è andata, sinceramente non so come ringraziarti veramente, non so dimmi tu : - )

Ci sono stati tre momenti nell'implementare questa istruzione visibili pure nel forum, il primo dell'incertezza, non sapevo se fosse facile o difficile implementare le operazioni pianificate, il secondo, lo definirei di entusiasmo e quasi delusione per la troppa facilità con cui ero riuscito a richiamre il command button, della mia funzione ma all'interno della stessa form, il terzo invece della sopresa negativa quando tutto sembrava fatto non riuscivo a richiamare un command button di un'altra form.

Fortuna che mi hai dato una grossa mano, veramente grossa.


Ti ringrazio veramente tanto.

Amartya.

P.S.
Con la risoluzione di questa problematica ormai mi sono rimasti solo 2 problemi affinchè finisca l'applicazione, uno di questi per me è risultato difficile anche se chiaramente risolvibile. Vedrò di risolverlo io la prossima settimana. Sai se posto un quesito vuol dire che probabilmente le ho provate tutte e non ci sono riuscito. Mi piace sbattermi un po così oltre a rompere di meno ho notato che apprendo di più.

SSUPERPIPPO Profilo | Guru

E' sempre un piacere...

Alla prossima, ciao

Alessandro

P.S.: Clicca su Accetta così chiudiamo il post.


http://blogs.dotnethell.it/alebadalin
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5