Newsgroup: it.comp.lang.delphi
Titolo: threed o altro sistema?

ciao a tutti, ho un applicazione che gestisce una coda di spool sms, ovvero
ho una tabella che ogni minuto viene querata per cercare se ci sono sms da
inviare in una determinata data/ora e in caso affermativo lancia l'invio di
ognuno. Il mio problema è che questa operazione è sequenziale, ovvero:
-il timer parte
-lancia la query per cercare i messaggi del giorno/ora
-esegue ciclo per inviare
-ricomincia
secondo voi per cercare di velocizzare questa operazione, si possono usare
threed?? avete qualche idea in
proposito?
grazie e buone ferie
Simone

 sequenziale, ovvero:
Puoi usare il timer per creare un thread in cui eseguire le operazioni
rimanenti. Se il thread si autodistrugge è anche più semplice.
Attento soltanto a creare i componenti per accedere alla tabella
all'interno del thread. Non so che db e che componenti usi ma fai
comunque una ricerca per capire come usarli nei thread.
Antonio

 rimanenti. Se il thread si autodistrugge č anche piů semplice.


 righe da processare giusto??
Sì, beh in realtà ti basterebbe anche un solo thread. Quando il timer
scatta, allora crei il thread che esegue il lavoro di smistamento ed
invio degli sms e gli inserimenti nelle tabelle che devi fare. Se lo
autodistruggi non hai grossi problemi, altrimenti dovrai coordinare il
timer con il thread qualora le operazioni nel thread durino più di un
minuto.
Antonio

 ha scritto nel messaggio
news:ENZRc.93788$OR2.5...@news3.tin.it...


 parte dei vari thread con contemporaneamente scrivono nel db
Ti ci vorrebbero dei componenti DB adatti per lavorare sotto thread, dodati
dei metodi lock e unlock con i quali blocchi o sblocchi tutti gli altri
thread in esecuzione.
Ad ogni modo la sincronizzazione te la puoi creare con funzioni API
leggermente meno semplici, dai un'occhiata all'help su  CreateMutex,
ReleaseMutex, CloseHandle e WaitForSingleObject, ma se i componenti non sono
Thread-Safe potresti avere delle sorprese.
Ciao Giorgio

ciao, grazie per la risposta, io pensavo una cosa del genere:
il timer elabora la query dei messaggi da inviare
per ogni riga trovata lancia un threed che si occupa della spedizione,
scrittura, ecc.
quindi se ho 30 messaggi partono 30 thread e contemporaneamente viene
effettuato l'invio
che ne pensate?
Simone

> che ne pensate?
Ti crei un thread *suspended* all'avvio e ad ogni intervallo gestisci il suo
Resume.
All'interno del thread ti smazzi i tuo sms e per gli INSERT, UPDATE, DELETE
ti sincronizzi col thread principale.
Acqua

 ha scritto nel messaggio
news:4118cd60$0$4883$5402...@news.sunrise.ch...


 tutti?
Io ti consiglio di usarne uno solo.
Acqua
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

"Simone P." ha scritto nel messaggio

In realtà quello che devi fare può tranquillamente essere fatto con il tuo
timer, senza la necessità di "scomodare" i thread.
Utilizzerei i thread se:
- ci sono delle operazioni da monitorare (che quindi vengono analizzate dal
processo principale) ed eventualmente da interrompere/riprendere;
- l'Interfaccia Utente deve potersi mantere attiva senza creare problemi di
prestazioni o blocchi temporanei (durante l'esecuzione del timer infatti, il
resto dell'applicazione è bloccato, salvo qualche chiamata a
ProcessMessages).
Fatto salvo questo, il timer, da solo, è più che funzionale.
La soluzione mista (timer + thread creato dal timer) può crearti molti
problemi nel momento in cui l'operazione duri piu dell'intervallo del timer
a causa della sincronizzazione degli stessi.
Piu o meno abbozzando una soluzione:
Individuerei il fattore piu' critico dell'intero problema: l'invio di un
singolo sms. Critico perchè per vari motivi potrebbe non riuscire, subire
dei ritardi, ecc. (ora non so se devi rimanere in attesa dell'ok dalla
periferica che effettua fisicamente l'invio).
Questa singola operazione potresti metterla in un thread, in modo che
dall'esterno (ovvero dal processo principale) possa essere controllata,
interrotta, ripresa, ecc.
Questo thread dovrebbe essere "vivo" per tutta la durata dell'applicazione
ed esporre:
- un metodo che riceva tutti parametri per l'invio del singolo sms;
- una proprietà di stato per indicare se è in corso l'operazione di invio
dell'sms, o se è in attesa di fare qualcosa;
- una proprietà di errore relativa all'ultimo sms mandato: ad esempio se
zero tutto ok, se 1 errore, ecc.
In sostanza questo thread:
- viene creato all'avvio dell'applicazione;
- resta in attesa;
- viene attivato attraverso il metodo di invio del singolo sms;
- mentre sta elaborando un sms, un flag di stato permette di gestire un
eventuale time-out;
- permette di gestire un eventuale errore nell'invio;
- al termine dell'applicazione viene distrutto.
Per attivare questo thread io ne utilizzerei un secondo che:
- dal termine dell'ultima operazione attende X millisecondi (GetTickCount) e
parte con l'elaborazione. Con il timer non puoi, perchè questo ti garantisce
di essere eseguito ogni intervallo, indipendentemente dalla durata
dell'operazione dell'evento OnTimer. Quindi se, supponendo, l'operazione per
molte volte ti dura piu dell'intervallo, l'applicazione potrebbe creare dei
problemi, o comunque impedire all'Utente di intervenire attraverso
l'Interfaccia;
- allo scadere degli X millisecondi parte la funzione di ricerca degli sms
da inviare (lettura da database, immagino);
- per ogni sms da inviare, invia il comando al thread  di cui sopra e resta
in attesa del completamento (verificando ciclicamente lo stato);
- in questo modo puoi impostare un timeout entro il quale il thread del
singolo sms dovrà aver completato l'operazione;
- in caso di timeout puoi, ad esempio, sospenderlo e far ritentare
l'operazione;
- al termine dell'operazione verifichi l'eventuale condizione di errore e
decidi cosa fare;
- registri a database l'invio, ecc.;
- al termine di tutti gli sms, ti registri (sempre GetTickCount) il
completamento e fai in modo che il thread resti latente per l'intervallo X
prestabilito;
- scaduto l'intervallo X, riprende tutto dall'inizio.
L'Interfaccia Utente... ora sei libero di gestirla come meglio credi. Magari
puoi mettere un timer che ogni Y vada a verificare lo stato dei tuoi thread
ed eventualmente aggiorni qualche elemento a video. Io aggiungerei qualche
pulsante almeno per le funzioni di start/stop del ciclo.
Ciao,
Gianluca.