Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
#1

Очередь из socket connect() как очистить? - Программирование Android

07.08.2016, 22:46. Просмотров 371. Ответов 14
Метки нет (Все метки)

Ситуация есть два устройства их нужно соединить по Bluetooth . Одно устройство с включенным датчиком с интервалом в пару секунд пытается подключиться выполняя socket.connect(); второе устройство выключено. Как только оно включается то соединение устанавливается, но проблема в другом. При выключенном втором устройстве естественно получаем ошибку соединения. Но ошибки приходят с задержкой . То есть цикл выполнился например 100 раз а получились всего 30-40 ошибок НО оставшиеся 70-60 ошибок соединения обязательно придут, все до одной в течении времени , даже если закрыть программу . То что пытается выполнять все 100 попыток socket.connect(); видно в логе. То есть фактически создается очередь. И необходимо ее после остановки цикла очистить. То есть прекратить попытки соединения. Как такое можно впринципе сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2016, 22:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Очередь из socket connect() как очистить? (Программирование Android):

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение....

Как очистить canvas?
Если в коде использовать Offset (сдвиг экрана), то предыдущий кадр анимации...

Как изменить таймаут Socket.Connect
когда посылаю запрос на подключение по адресу на котором не запущен клиент, то...

как очистить очередь печати
собственно сабж. желательно без прав администратора. спасибо

Как очистить очередь сообщений на VB?
Есть долгоиграющий процесс. Пока он ... течет, злобный юзверь давит клаву. Как...

Как очистить и вывести всю очередь?
Привет)Помоги написать 2 функции. Мои наработки воть: #include <iostream>...

14
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
08.08.2016, 06:16 #2
Star2016, очевидно - при ошибке соединения не пытайтесь переподключаться.
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
08.08.2016, 09:26  [ТС] #3
проблема в том что это необходимо. То есть в случае потери связи запускается цикл для ее восстановления.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
08.08.2016, 09:32 #4
Star2016, у вас я так понял все это работает в потоке. при сбое приема-передачи или подключения делается новая попытка подключения. когда закрываете приложение просто поставьте флаг "хватит пытаться" и зарубите сокет - вылетит ошибка приема-передачи или подключения, но поток проверив флаг не станет ничего делать и просто завершится
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
08.08.2016, 09:59  [ТС] #5
Цикл работает с глобальной переменной из Singleton если true (соединение успешно) то прекращаются попытки соединения иначе продолжаются.
А как можно сделать то что вы предлагаете ? (если не трудно то на примере кода, пожалуйста).
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
08.08.2016, 11:06 #6
Star2016
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class App extends Application {
    public static Thread thread = null;
 
    public static void startThread() {
        thread = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                /*
                делаем что-то
                если приложение уже не хочет что бы мы что-то делали
                просто прерываем поток
                */
                }
            }
        });
        thread.start();
    }
 
    public static void wait_for_thread() {
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
            }
        }
    }
 
    public static void interrupt() {
        if (thread != null) {
            thread.interrupt();
        }
    }
};
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
09.08.2016, 15:01  [ТС] #7
не помогло. На thread.interrupt(); не реагируют
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,449
Завершенные тесты: 1
09.08.2016, 15:02 #8
код?
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
09.08.2016, 21:35  [ТС] #9
ситуация немного изменилась. Стало понятно что нужно

сделал так
Java
1
2
3
4
5
       myclThread.start();
        if (myclThread!=null)
        {
            myclThread.join();
        }
вставил я это в код activity . Все работает прекрасно. Теперь нет сотен открытых потоков . Потоки создаются один за одним отработал первый создается второй третий, НО идут сильные подвисания так как join тормозит основной поток. Мне теперь даже не надо закрывать потоки, они сами завершаются, НО от подвисаний как то надо избавиться
0
powowstal
30 / 30 / 5
Регистрация: 21.03.2013
Сообщений: 369
09.08.2016, 23:35 #10
Star2016,
Цитата Сообщение от Star2016 Посмотреть сообщение
НО от подвисаний как то надо избавиться
только без ожидания join. Не проще в потоке после каждой интерации производить задержку sleep между следующим запросом на соединение. Или запустить поток в каком то Runable классе с использованием join.
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
10.08.2016, 08:21 #11
Star2016, чего вы творите не ясно, код который я привёл рабочий, вашего кода не видели
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
10.08.2016, 16:27  [ТС] #12
печаль в том что с join получилось все отлично НО тормозит сильно (300 фреймов примерно пропускает)
со sleep пробовал - плохо. слишком медленно.

Добавлено через 10 минут
Ваш код хорош, но пока я разбирался в том коде что вы мне показали, я заметил join прочитал про него и понял что на нем можно реализовать работу потоков один за одним. То есть один поток попытался установить соединение , не получилось пошел второй поток, третий. То есть не открывается сразу много потоков а один за одним. НО беда в том что join почему то тормозит основной поток и естественно программу. Почему так происходит для меня загадка. Либо я как то не так использую join либо зачем тогда он нужен если он подвешивает основной поток

Join я использую так
Java
1
2
3
4
5
    myclThread.start();
        if (myclThread!=null)
        {
            myclThread.join();
        }
в моем понимании этот код выполняется так. В основном потоке запускаем myclThread после этого myclThread.join(); и это приводит к тому что запущенный поток выполняется а запуск остальных откладывается до завершения запущенного. Никак не могу понять почему точмозит основной
0
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
10.08.2016, 18:32 #13
Star2016, тормозит потому что джой ждёт завершения потока. Не нужно ничего друг за другом запускать и ничего ждать - делайте все в ОДНОМ потоке - в бесконечном цикле делайте попытку подключится, если не вышло ещё и ещё и ещё... интерапт и джой только если задумали убить свой поток
1
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
10.08.2016, 19:10  [ТС] #14
Вот теперь я вашу идею полностью понял. Действительно, ваше решение лучше моего которое я только что придумал и которое работает. Видимо придется переписать.

Я решил проблему без join в самом верху run ставлю true внизу false и проверка при запуске потока если false (то есть предыдущий поток отработал) то запускаем новый поток. если true то бездействуем (ждем завершения). Работает хорошо, но ваше решение красивей и лучше.
Спасибо. Тему можно закрывать.
1
Mikhail1990
26 / 25 / 6
Регистрация: 22.03.2014
Сообщений: 269
11.08.2016, 15:59 #15
Еще предложение, сам только что столкнулся с этой проблемой. На примере bluetoothchat android там есть класс SPPHelper и подкласс ConnectedThread (унаследован от Thread) он управляет всеми входящими/исходящими данными. В методе run() когда соединение было разорвано кидается исключение и поток останавливается. В том блоке в котором ловим это исключение шлем Handler.SendMessage() с командой на рестарт соединения (один раз так как после поток остановлен). В главном активити его ловим и там пытаемся запускать до посинения без создания доп потока.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while (true) {
 
                try {
                    BtRc = mmInStream.read(); //тут кидает исключение если обрыв 
                } catch (IOException e) {
 
                    //TODO save connection after screen orientation was changed
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
 
                    //TODO re-establish a connection
                    Message msg = mHandler.obtainMessage(MainActivity.TRY_TO_RESTART);
                    Bundle bundle = new Bundle();
                    bundle.putString(MainActivity.RESTART, "Re-establishing a connection...");
                    msg.setData(bundle);
                    mHandler.sendMessage(msg);
 
                    return;//Receiving = false;
                }
//.......some code
}
Ловим в главном активити

Java
1
2
3
4
5
6
7
 case TRY_TO_RESTART:
                        String data = msg.getData().getString(RESTART);
                        Toast.makeText(App.getContext().getApplicationContext(), data, Toast.LENGTH_LONG).show();
 
                        theFrag.sppHelper.connect(theFrag.HC05device);
                    }
                    break;
0
11.08.2016, 15:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 15:59
Привет! Вот еще темы с решениями:

Как очистить очередь событий в потоке QThread
Поток запускаю и останавливаю несколько раз. При запуске потока добавляю в него...

Как можно заблокировать очередь и как ее очистить и терять поступающие заявки?
Уважаемый администратор Сергей, господа посетители форума! Не поможете ли...

Как получить список принтеров и очистить очередь печати выбранного принтера?
Как получить список принтеров и очистить очередь печати выбранного принтера? ...

Socket.Connect() Timeout
Подскажите, как можно выставить таймаут соединения для метода Connect() у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru