jeanfr (Normal User)
Newbie
Messaggi: 1
Iscritto: 30/06/2008
|
Salve a tutti, ho la necessità di lanciare un thread che deve rimanere in escuzione per un tempo prefissato e alla scadenza di questo timer deve partire un altro thread!Sto facendo una applicazione TX/RX per cellulari in tecnologia Bluetooth. Qualcuno può aiutarmi?
Grazie mille
|
|
VaLeRiO (Ex-Member)
Pro
Messaggi: 114
Iscritto: 28/06/2008
|
se i Thread per cellulari funzionano allo stesso modo di quelli per PC ti posso dare una mano.
|
|
russogia4 (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/07/2008
|
Ciao Valerio, da quello che ho potuto trovare in rete i thread in J2ME si comportano allo stesso modo di un normale thread java.Il mio problema è il seguente:
Ho due thread, uno che permette al cell di porsi in ricezione ed un altro che permette di effettuare una ricerca dei dispositivi. L'applicazione ogni 20 secondi deve splittare da un thread ad un altro. Io ho provato mediante una chiamata a system.currentTimeMillis() così come segue:
listener.start();
sender.start();
startTime=System.currentTimeMillis();
stopTime=startTime+20000;
while(true){ //apro un ciclo infinito, ovvero salto sempre da un thread ad un altro
if(System.currentTimeMillis()<stopTime)
continue;
//non appena esco dal while dopo 20 secondi, interrompo il thread di ascolto e lancio quello di ricerca
listener.interrupt();
//aggiorno le variabili temporali startTime=System.currentTimeMillis();
stopTime=startTime+20000;
while(System.currentTimeMillis()<stopTime)
continue;
sender.interrupt();
listener.start();
So che non sarà esatto il codice ma l'ho postato per spiegarti l'idea di base qual'è!
Confido in un tuo aiuto
Grazie anticipatamente per la disponibilità!
|
|
VaLeRiO (Ex-Member)
Pro
Messaggi: 114
Iscritto: 28/06/2008
|
Fammici pensare un'attimo ..
Se ho capito bene potresti fare così:
Se puoi, crei un Thread che può fare una cosa simile:
Codice sorgente - presumibilmente Java |
while(isRunning) { thread1.doStart(); thread2.doStart(); }
|
Quindi, avvii il thread per la ricezione, aspetti TIME e avvii quello per lo scan, aspetti TIME e riavvii quello per la ricezione e via dicendo.
Questo se però non è necessaria la sincronizzazione. Perchè se così fosse ti consiglio di usare un Lock e una Condition.
Se è questo il caso poi cerco di spiegarti meglio.
|
|
russogia4 (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/07/2008
|
Effettivamente credo che ho bisogno di una sincronizzazione.Ti spiego: il thread che mette in ricezione il dispositivo, se accetta una nuova connessione, deve prevedere la ricezione di dati, indipendentemente che lo sleep del processo di ricerca mi risvegli il thread di ricerca stesso.Proprio per questo motivo nella classe a cui fa capo il thread di ricezione ho messo un blocco syncronized, ma non so se ho fatto bene.Ti posto di seguito il codice della classe incriminata (le istruzioni le puoi anche ignorare servono solo ad accettare una connessione remota ed eventualmente a ricevere dei dati):
public void run() {
try{
localDevice =LocalDevice.getLocalDevice();
agent = localDevice.getDiscoveryAgent();
isReady=true;
//rendo il dispositivo visibile a tutti (inquiry scan) con l'istruzione successiva
localDevice.setDiscoverable(DiscoveryAgent.GIAC);
L2CAPConnectionNotifier notifier =....//non importante
while (isReady){
//il dispositivo si mette in attesa di qualche connessione
L2CAPConnection conn =notifier.acceptAndOpen();
try{
int receiveMTU = conn.getReceiveMTU();
if(conn.ready()){//pronto a ricevere
synchronized(this){//-->quello di cui ti
parlavo
//blocco per ricevere
if (receiverStateMachine==0){
byte[] sizeInBytes = new byte[8];
int bytes=conn.receive(sizeInBytes);
//Continua ma non è importante postarti tutto il metodo
Devo comunicare qualcosa o il syncronized ignora lo sleep?
Grazie della dritta che mi hai postato precedentemente è risultata molto utile a chiarire un pò di dubbi
|
|
VaLeRiO (Ex-Member)
Pro
Messaggi: 114
Iscritto: 28/06/2008
|
Allora credo di avere capito il problema. Ora provo a spiegarti in via teorica facendo cenni agli oggetti da utilizzare come eseguire una sincronizzazione. Non mi addentro nella sintassi, ti consiglio di leggerti qualche tutorial per quello.
Pur non essendo la sincronizzazione una materia che conosco bene proverò comunque a tentare di farti capire.
Il principio di quello che devi fare tu è lo stesso di quella della relazione tra produttore/consumatore.
Come funziona? (non ti servirà concretamente ma capirai cosa devi fare)
Mettiamo che hai un'oggetto che crea valori interi e un'altro che li legge. Ogni qualvolta il produttore crea un intero il consumatore deve leggerlo e salvarlo. Solo dopo che il consumatore ha letto, il produttore può mettere quello nuovo. Produttore e consumatore accedono al valore tramite un buffer condiviso (magari passato al costruttore degli oggetti).
Se lo facessimo con un ciclo while, il risultato sarebbe inanzitutto un devastante spreco di memoria e poi un'altissima probabilità di errore per quanto riguarda l'esattezza del numero. Può accadere che il produttore produca 3 valori prima che il consumatore ne prenda 1, quindi i primi 2 andranno persi. E' quindi tutto aleatorio e fallimentare.
Andiamo quindi a utilizzare un Lock e una Condition. Quando il produttore sta producendo mette un lock all'oggetto condiviso, cioè blocca e soltanto dopo aver finito sblocca e avvisa tramite la condition di avere finito. A quel punto, il consumatore, che nel frattempo si era accorto del blocco e stava aspettando il via del produttore per prendere il valore riparte. Preso il valore, avvisa il produttore, il quale si era bloccato avendo visto che il Lock lo aveva preso il consumatore. E và avanti così.
Ora applicarlo nel tuo programma non è difficile.
Ti dò un piccola spinta su dove cominciare a cercare:
Codice sorgente - presumibilmente Java |
Lock accessLock = new ReentrantLock(); Condition canRun = accessLock.newCondition();
|
I metodi che vai a utilizzare sono questi:
Codice sorgente - presumibilmente Java |
accessLock.lock(); // Blocca l'oggetto accessLock.unlock(); // Sblocca l'oggetto canRun.await(); // Si mette in attesa del signal canRun.signal(); // Sveglia dal await
|
Quei metodi vanno poi "mischiati" fra di loro per ottenere quello che vuoi fare tu.
Ora basta che cerchi qualche esempio in giro e ti chiarisci tutto.
Spero di non essere stato troppo dispersivo, non sono tanto bravo a spiegare.
Spero di averti aiutato e buon proseguimento!
Fammi sapere! Ciao |
|
russogia4 (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/07/2008
|
Grazie Valerio mi hai fornito un buon punto di partenza, ti farò sapere come finirà....speriamo bene!!!
|
|
russogia4 (Normal User)
Newbie
Messaggi: 5
Iscritto: 02/07/2008
|
Grazie Valerio mi hai fornito un buon punto di partenza, ti farò sapere come finirà....speriamo bene!!!
|
|
VaLeRiO (Ex-Member)
Pro
Messaggi: 114
Iscritto: 28/06/2008
|
Bene sono contento! :P Poi quando riesci magari spiegaci 1 pò cosa hai fatto giusto per curiosità!
|
|