Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Thread in j2me
Forum - Java - Thread in j2me

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
jeanfr (Normal User)
Newbie


Messaggi: 1
Iscritto: 30/06/2008

Segnala al moderatore
Postato alle 10:06
Lunedì, 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

PM Quote
Avatar
VaLeRiO (Ex-Member)
Pro


Messaggi: 114
Iscritto: 28/06/2008

Segnala al moderatore
Postato alle 14:30
Mercoledì, 02/07/2008
se i Thread per cellulari funzionano allo stesso modo di quelli per PC ti posso dare una mano.

PM Quote
Avatar
russogia4 (Normal User)
Newbie


Messaggi: 5
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 17:07
Mercoledì, 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à!
      

PM Quote
Avatar
VaLeRiO (Ex-Member)
Pro


Messaggi: 114
Iscritto: 28/06/2008

Segnala al moderatore
Postato alle 17:31
Mercoledì, 02/07/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

  1. while(isRunning) {
  2.  
  3.     thread1.doStart();
  4.     try { Thread.sleep(TIME); } catch(Exception e) {}
  5.  
  6.     thread2.doStart();
  7.     try { Thread.sleep(TIME); } catch(Exception e) {}
  8.  
  9. }



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.

PM Quote
Avatar
russogia4 (Normal User)
Newbie


Messaggi: 5
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 11:50
Giovedì, 03/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

PM Quote
Avatar
VaLeRiO (Ex-Member)
Pro


Messaggi: 114
Iscritto: 28/06/2008

Segnala al moderatore
Postato alle 15:03
Giovedì, 03/07/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

  1. Lock accessLock = new ReentrantLock();
  2. Condition canRun = accessLock.newCondition();



I metodi che vai a utilizzare sono questi:
Codice sorgente - presumibilmente Java

  1. accessLock.lock();   // Blocca l'oggetto
  2. accessLock.unlock(); // Sblocca l'oggetto
  3.  
  4. canRun.await();  // Si mette in attesa del signal
  5. 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

PM Quote
Avatar
russogia4 (Normal User)
Newbie


Messaggi: 5
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 8:57
Venerdì, 04/07/2008
Grazie Valerio mi hai fornito un buon punto di partenza, ti farò sapere come finirà....speriamo bene!!!

PM Quote
Avatar
russogia4 (Normal User)
Newbie


Messaggi: 5
Iscritto: 02/07/2008

Segnala al moderatore
Postato alle 8:58
Venerdì, 04/07/2008
Grazie Valerio mi hai fornito un buon punto di partenza, ti farò sapere come finirà....speriamo bene!!!

PM Quote
Avatar
VaLeRiO (Ex-Member)
Pro


Messaggi: 114
Iscritto: 28/06/2008

Segnala al moderatore
Postato alle 10:29
Venerdì, 04/07/2008
Bene sono contento! :P Poi quando riesci magari spiegaci 1 pò cosa hai fatto giusto per curiosità!

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo