Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
#1

Доступ к потоку из разных потоков - Программирование Android

30.05.2015, 16:06. Просмотров 172. Ответов 0
Метки нет (Все метки)

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private Handler Ocnova = new Handler(); 
private Object sync = new Object();  private potok2 thread2 = null;
 
class potok2 extends Thread {
public boolean motion = false;
//...   
    public void run() {
        while(motion) {
            //...
        }
    }
}
class potok1 extends Thread {
//...String mes.....
   public void run() {
      while(true) {
         //.. socket.read(); // ждем пока не получим mes
         if("start".compareTo(mes) == 0) {
            synchronized(sync) { 
                Ocnova.post(new hand(this, mes)); // вот здесь работает коряво (Текст не отображает, как надо)
                try {sync.wait();} catch (InterruptedException e) {  }
            }
         }
         else if("stop".compareTo(mes) == 0) {
             synchronized(sync) {
                if (thread2 != null && thread2.isAlive() == true) { // если поток2 жив, останавливаем его (thread2 объявлен глобально)
                    thread2.motion = false; thread2.interrupt(); try{ thread2.join(3000); }catch(InterruptedException e){  } thread2 = null;
                }
            }
            break;
         }
      }
   }
}
//GUI-Thread
//...
if(условие) { new potok1().start(); }
//...
class hand implements Runnable {
    private potok1 thread1 = null; private String mes = null;
    public Potok4(potok1 thread1, String mes) {this.mes = mes; this.thread1 = thread1;}
    //...
    public void run() {
        synchronized(sync) {//ecли убрать отсюда thread2, все работает норм, когда же тут стоит thread2 тексты отоброжаются коряво.
            //... 
            if(всякие проверки, которые работаю только в gui) {
                if (thread2 == null || thread2.isAlive() == false) { // если поток2 не запущен, запускаем его (thread2 объявлен глобально)
                    tx1.setText("Поток2 не запущен, запускаем...");
                    thread2 = new potok2(); thread2.motion = true; thread2.start();
                }
                else {
                    tx1.setText("Поток2 уже работает");
                }
            }
            else {
                tx1.setText(mes);
            }
            sync.notify();
        }
   }
}
В общем есть "три" потока: gui-поток, potok1, potok2. Экземпляры класса potok1 запускаются в новом потоке из gui-потока. Экземпляр класса potok2 объявлен глобально, его нужно запускать в новом потоке из gui-потока, и останавливать из потока potok1.
Вот в чем проблема:
Из potok1 нам нужно обращаться к методам(гр. интерфейсу), которые работают только в GUI, поэтому использую Handler. Но даже, если использую Handler, текст коряво отображается или вовсе не отображается. Такое происходит только, если внутри класса hand находится thread2. Если его убрать из hand, все работает нормально. Но мне ведь нужно внутри hand делать манипуляции с thread2, например запустить его. В чем ошибка и как его устранить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2015, 16:06     Доступ к потоку из разных потоков
Посмотрите здесь:
Доступ к базе данных из разных активити Android
Android Обращение из сервиса к основному (UI) потоку
Тонкости потоков Android
Android Ожидание завершения пула потоков
Доступ к БД с разных потоков C# .NET 4.x
доступ к стриму из разных потоков C#
Доступ к очереди из разных потоков C#
C++ Builder Доступ к функции с разных потоков C++ Builder
Обезопасить доступ к коллекции из разных потоков C#
Обеспечить корректный доступ к элементу из разных потоков C# WPF
Разграничить переменную result при создании потоков, что бы результат был по каждому потоку C# .NET 4.x
Доступ к закрытому потоку невозможен C#

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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