Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
#1

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

07.08.2016, 22:46. Просмотров 344. Ответов 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 - Программирование Android
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение. Клиент - приложение на Android устройстве. Сервер - Приложение...

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

Как изменить таймаут Socket.Connect - C#
когда посылаю запрос на подключение по адресу на котором не запущен клиент, то получаю исключение: "Попытка установить соединение была...

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

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

Как очистить и вывести всю очередь? - C++
Привет)Помоги написать 2 функции. Мои наработки воть: #include <iostream> using namespace std; struct Node { int data; Node...

14
vxg
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
08.08.2016, 06:16 #2
Star2016, очевидно - при ошибке соединения не пытайтесь переподключаться.
0
Star2016
5 / 5 / 0
Регистрация: 26.07.2016
Сообщений: 233
08.08.2016, 09:26  [ТС] #3
проблема в том что это необходимо. То есть в случае потери связи запускается цикл для ее восстановления.
0
vxg
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
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
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
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
2578 / 2060 / 642
Регистрация: 12.05.2014
Сообщений: 7,224
Завершенные тесты: 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 / 6
Регистрация: 21.03.2013
Сообщений: 369
09.08.2016, 23:35 #10
Star2016,
Цитата Сообщение от Star2016 Посмотреть сообщение
НО от подвисаний как то надо избавиться
только без ожидания join. Не проще в потоке после каждой интерации производить задержку sleep между следующим запросом на соединение. Или запустить поток в каком то Runable классе с использованием join.
0
vxg
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
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
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
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
21 / 20 / 4
Регистрация: 22.03.2014
Сообщений: 247
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
Привет! Вот еще темы с ответами:

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

Как получить список принтеров и очистить очередь печати выбранного принтера? - Visual Basic
Как получить список принтеров и очистить очередь печати выбранного принтера? Вторая часть "Очистить очередь печати"...

socket connect зависает - C++
Добрый день. При вызове connect прога зависает. Вот код: bool ConnectionManager::ConnectSocket(int ID) { char buffer; string...

Socket.Connect таймаут - C#
функция отправки сообщения: void SendText(String IP) { int port; if...


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

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

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