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

Доступ к потоку из разных потоков

30.05.2015, 16:06. Просмотров 228. Ответов 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, например запустить его. В чем ошибка и как его устранить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2015, 16:06
Ответы с готовыми решениями:

Запись в базу данных из разных потоков
Как мы знаем, в базу можно писать только по очереди т.е. нельзя в один момент...

Доступ к базе данных из разных активити
В общем-то в теме и вопрос, как получить доступ к базе данных и разных...

Обращение из сервиса к основному (UI) потоку
как сделать так чтобы из сервиса можно было обращаться к основному потоку в...

Доступ к БД с разных потоков
как реализовать доступ к одной базе данных с разных потоков? когда один сервер...

Доступ к стриму из разных потоков
Задача такая, имеем мемористрим, в одном потоке постоянно пишем его. В другом...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 16:06

Доступ к очереди из разных потоков
Подскажите по многопоточности, у меня есть очередь (Queue) и мне надо...

Доступ к функции с разных потоков C++ Builder
Как правильно объявить/создать функцию в C++Builder, чтобы она была доступна со...

Обезопасить доступ к коллекции из разных потоков
станет ли безопасным метод AddSafe? public static MyCollection myCol = new...


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

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

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