2009-04-07 2 views
5

Ho un'app che deve attivare un paio di eventi in determinati momenti durante il giorno - gli orari sono tutti definiti dagli utenti. Posso pensare ad un paio di modi per farlo ma nessuno di loro si siede troppo bene. I tempi non devono essere di una risoluzione particolarmente alta - un minuto circa ogni via va bene.Un buon modo di sparare un evento in una particolare ora del giorno?

Le mie idee:

  1. Quando l'applicazione si avvia leggere tutti i tempi e iniziare timer off che esegue un controllo al momento opportuno

  2. Avviare un timer di spegnimento che controllerà ogni minuto o quindi per "eventi correnti"

tia per qualsiasi soluzione migliore.

risposta

4
  • Memorizza/indicizza gli eventi ordinati in base alla prossima necessità di attenzione. Questo potrebbe essere in memoria o meno in base a quante ci sono, quante volte si apportano modifiche, ecc. Se tutti gli eventi si attivano una volta al giorno, questo elenco è fondamentalmente un buffer circolare che cambia solo quando gli utenti modificano i propri eventi.
  • Avvia un timer che "spunta" al momento dell'evento in testa alla lista. Arrotondare al minuto successivo se ti piace.
  • Quando il timer scocca, elabora tutti gli eventi che sono ora in passato [modifica e che non sono già stati elaborati], reinserirli nell'elenco se necessario (cioè se non si dispone della buffer "ottimizzazione) e impostare un nuovo timer.

Ovviamente, quando si modifica l'insieme di eventi o si modifica l'ora per un evento esistente, potrebbe essere necessario reimpostare il timer per attivarlo prima. Di solito non è necessario resettarlo per sparare più tardi, puoi anche lasciarlo andare e non fare nulla. E se si imposta un limite superiore di un minuto per quanto tempo può essere eseguito il timer (o si dispone solo di un timer ricorrente di 1 minuto), è possibile ottenere una precisione di 1 minuto senza mai effettuare il reset. Questa è fondamentalmente la tua opzione 2.

Probabilmente dovresti usare un framework esistente piuttosto che il tuo, ma non conosco C# quindi non ho idea di cosa sia disponibile. Sono generalmente un po 'diffidente nell'idea di impostare squillions di timer, perché alcuni ambienti non supportano questo (o non lo supportano bene). Da qui questo schema, che richiede solo uno. Non so se C# abbia qualche problema in questo senso, ma questo schema può essere facilmente organizzato per usare O (1) RAM, se necessario, che non può essere battuto.

+0

Mi piace anche questo approccio. – GWLlosa

3

Questo suona come un caso classico per un servizio di Windows. Penso che ci sia un tipo di progetto di servizio di Windows in VS2005/2008. Il servizio accoppiato con un semplice database e un'applicazione front-end per consentire agli utenti di impostare i tempi di attivazione sarebbe tutto ciò che serve.

Se non cambia molto spesso, l'opzione Attività pianificate è anche un'opzione.

4

Dai un'occhiata allo Quartz.Net. È un framework scheduler (originariamente per Java).

+0

Utilizziamo Quartz nel nostro team per Java. Lo consiglio vivamente. È rilasciato sotto la licenza Apache 2.0 (gratuito da usare, da accreditare dove dovuto) –

1

Ho scritto alcuni programmi seguendo queste linee.

Suggerisco # 2. Tutto ciò che devi fare è tenere un elenco di volte in cui gli eventi sono "dovuti", e ogni X quantità di tempo (a seconda della tua risoluzione) controlla il tuo elenco per gli eventi "ora". Puoi scegliere un'ottimizzazione se puoi garantire che l'elenco sia ordinato e che ogni evento nell'elenco sia dovuto esattamente una volta.Altrimenti, se hai eventi ricorrenti, devi assicurarti di coprire la tua finestra. Quello che voglio dire è che se hai un evento che è dovuto alle 11:30 e stai controllando ogni secondo, allora è possibile che tu possa controllare alle 11:29:59, e poi non di nuovo fino alle 11:31: 01, a causa della inprecisione delle fasce temporali della CPU. Quindi dovrai essere sicuro che uno di questi controlli (11:29 o 11:31) continua a prendere il colpo alle 11:30, e che solo uno di loro lo fa (cioè, tu non corri ad entrambi gli 11: 29 e 11:31).

Il vantaggio di questo approccio è sopra il controllo solo sui tempi si sa di essere sulla vostra lista è che permette la vostra lista a essere modificato da 3 parti senza la vostra conoscenza, e il vostro gestore di eventi continuerà a 'solo di lavoro'.

0

Il modo più semplice sarebbe probabilmente utilizzare lo scheduler di Windows.

Altrimenti è necessario utilizzare una delle classi di timer, calcolando quanto tempo fino al primo evento. Questo approccio, a differenza dello scheduler, consente di individuare nuovi eventi dal processo in esecuzione (e, eventualmente, reimpostare il timer).

0

Il problema con # 1 è che il numero di millisecondi prima di un evento potrebbe essere troppo grande per essere memorizzato nell'intervallo del timer e, man mano che il numero di eventi aumenta, il numero di timer potrebbe non essere soddisfacente.

Non vedo nulla di sbagliato con # 2, ma opterei per uno sfondo o un thread.