Autore Topic: Killare thread  (Letto 415 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Killare thread
« il: 13 Giugno 2016, 12:23:23 CEST »
0
Ciao a tutti, ho bisogno di killare un thread perchè all'interno ci sono vari cicli for e, nel caso in cui venisse a mancare la connessione bluetooth, l'app rimane all'interno di uno di quei for e quindi la CPU schizza a valori molto alti.
Leggendo sul web ho trovato questo comando:
Codice (Java): [Seleziona]
nomeThread.currentThread().interrupt(); 

Questo però non fa in modo che il thread venga chiuso realmente, dove sbaglio?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 583
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Killare thread
« Risposta #1 il: 13 Giugno 2016, 17:06:06 CEST »
+1
Non sono sicuro di quale sia il metodo migliore per interrompere un thread, ma forse è meglio risolvere il problema a monte: non hai davvero modo di forzare l'uscita da quei cicli for? Credo sia meglio gestire l'errore così piuttosto che killare il thread...
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Killare thread
« Risposta #2 il: 14 Giugno 2016, 08:30:41 CEST »
0
Si, ho pensato fosse la soluzione migliore. Solo che quando riavvio il primo thread non riesco più ad agganciare le connessioni bluetooth, sembra quasi che non inizializzi il server anche se non presenta nessun errore.

Codice (Java): [Seleziona]
public class ListeningThread extends Thread {
        private final BluetoothServerSocket bluetoothServerSocket;

        public ListeningThread() {
            BluetoothServerSocket temp = null;
            try {
                temp = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(getString(R.string.app_name), uuid);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception ee) {

            }
            bluetoothServerSocket = temp;
        }

        public void run() {

            // This will block while listening until a BluetoothSocket is returned
            // or an exception occurs
            while (true) {
                try {
                    Log.d("provo", "provo");
                    bluetoothSocket = bluetoothServerSocket.accept();

                } catch (IOException e) {
                    Log.d("errore", "errore");

                    break;
                }
                boolean entro = false;
                Log.d("ciclo", "ciclo");
                // If a connection is accepted
                if (bluetoothSocket != null) {

                    runOnUiThread(new Runnable() {
                        public void run() {
                            Toast.makeText(getApplicationContext(), "A connection has been accepted.",
                                    Toast.LENGTH_SHORT).show();
                            recordButton.setEnabled(true);

                        }
                    });

                    // Manage the connection in a separate thread
                    String aa = bluetoothSocket.getRemoteDevice().getName();
                    r1 = new ReadThread(bluetoothSocket);
                    r1.start();


                    break;  // esco dal ciclo per utilizzo singola sonda
                    // problema che obbliga il riavvio dell'app in caso di connessione persa!

                }

            }
            Log.d("thread morto", "thread morto");
        }
    }

    public class ReadThread extends Thread {

        public BluetoothSocket bt;
        byte buffer[] = new byte[1000000];

        public ReadThread(BluetoothSocket aa) {
            bt = aa;

        }

        public void run() {

            isConnected=true;
            bb = ByteBuffer.allocate(2);
            String prova1 = "sync\n";
            byte[] send = prova1.getBytes();
            try {
                bt.getOutputStream().write(send);
            } catch (IOException e) {
                e.printStackTrace();
            }

            int contiamo = 0;

            tempoIniziale = System.currentTimeMillis();
            new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        tempoAttesa = System.currentTimeMillis();
                        long abc = tempoAttesa-tempoIniziale;
                        Log.d("tempoPassato", String.valueOf(abc));
                        if (abc > 10000) {
                            Log.d("entro", "chiudoThread");
                            isConnected=false;
//                            r1.currentThread().interrupt();
//                            r1=null;
                            break;
                        }
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();


            while (bt.isConnected() && ascolto == true && isConnected==true) {
                Log.d("CPU usage", String.valueOf(readUsage()));
                tempoIniziale = System.currentTimeMillis();
                try {
                    FunzioneDaProfessionisti(bt, buffer);
                    start1 = (short) (buffer[0] | (buffer[1] & 0xFF) << 8);
                    start2 = (short) (buffer[2] | (buffer[3] & 0xFF) << 8);
                    if (start1 == -1 && start2 == 0) {

                        contaCh1 = 0;
                        contaCh2 = 0;

                        for (int aa = 0; aa < 32; aa++) {
                            for (int ii = byteTesta + (datiMinimiLettura * aa); ii < datiMinimiLettura * (aa + 1) - byteCoda; ii += 2) {
                                if ((ii - byteCoda * aa) % 4 == 0) {
                                    bb.clear();
                                    bb.order(ByteOrder.BIG_ENDIAN);
                                    bb.put(buffer[ii]);
                                    bb.put(buffer[ii + 1]);
                                    Ch1 = bb.getShort(0);
                                    if (isRecording == true)
                                        listaTotaleAlternata.add(((short) (Ch1 + (65536 / 2))));
                                    listaCH1[contaCh1] = (short) (Ch1 + (65536 / 2));
                                    // Salvataggio su file
                                    if (play == true)
                                        salvataggioCH1.add((short) (Ch1 + (65536 / 2)));
                                    contaCh1++;
                                } else {
                                    bb.clear();
                                    bb.order(ByteOrder.BIG_ENDIAN);
                                    bb.put(buffer[ii]);
                                    bb.put(buffer[ii + 1]);
                                    Ch2 = bb.getShort(0);
                                    if (isRecording == true)
                                        listaTotaleAlternata.add(((short) (Ch2 + (65536 / 2))));
                                    listaCH2[contaCh2] = (short) (Ch2 + (65536 / 2));
                                    // Salvataggio su file
                                    if (play == true)
                                        salvataggioCH2.add((short) (Ch2 + (65536 / 2)));
                                    contaCh2++;
                                }
                            }
                        }
                        if (isRecording == true)
                            SalvaPacchettoSuFile();
                        messageHandler.sendEmptyMessage(0);
                        contaCh1 = 0;
                        contaCh2 = 0;
                        finito = false;
                        Thread.sleep(1);
                        Log.d("pacchetto", "piazzato");
                    } else {
                        Log.d("pacchetto", "perso");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Log.d("str", "catch");
                }


            }

            Log.d("str", "esci");
            try {
                bt.close();

                Log.d("connesso", String.valueOf(bt.isConnected()));
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bluetoothSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            makeDiscoverable();
            try {
                t0 = new ListeningThread();
                if (!t0.isAlive()) {
                    t0.start();
                    Log.d("lancio","read");
                }
                else
                    Log.d("thread","attivo");
            } catch (Exception c) {
                c.printStackTrace();
                Log.d("fallito","fail");
            }

        }
    }

Offline Carni

  • Nuovo arrivato
  • *
  • Post: 41
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S3
  • Play Store ID:
    R3D5HA
  • Sistema operativo:
    Windows 10
Re:Killare thread
« Risposta #3 il: 15 Giugno 2016, 12:34:00 CEST »
0
Attento stai lanciando dei thread all'interno di altri thread e non è consigliato perchè è molto facile perderne il controllo.

La cosa che ti consigli di fare è di provare a inserire tutto dentro un unico thread dove fai la ricerca, l'elaborazione e la chiusura. Poi ne fai un'altro che gestisce il thread descritto prima e tramite delle variabili condivise, quindi da proteggere tramite semafori, decida se stopparlo o lasciarlo eseguire o avviarlo.
« Ultima modifica: 15 Giugno 2016, 12:56:32 CEST da Carni »

Offline davix10

  • Utente normale
  • ***
  • Post: 155
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Killare thread
« Risposta #4 il: 15 Giugno 2016, 12:55:30 CEST »
0
Non pensavo fosse problematico aprire thread all'interno di altri thread. Grazie per l'aiuto

Inviato dal mio SM-G935F utilizzando Tapatalk