С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/41: Рейтинг темы: голосов - 41, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 7
1

Остановка потока. Выполнение действия по нажатию клавиши

05.07.2014, 14:28. Показов 7433. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. У меня такой вопрос. Например у меня есть класс генерации чисел, и другой класс это main, и любое сгенерированное число, я должен выводить на экран по нажатию кнопки,(работа именно через потоки) т.е. press button-> вывел 45-> press button -> вывел 83... и т.д. никак не могу приостотновить работу потока, т.к. сущетвует проверка на максимальное количество чисел, т.е. 10 например. Затолкать все в ActionListener я и сам смогу. Мне нужно именно остановить поток с сохранением итерации, и продолжить по нажатию клавиши.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2014, 14:28
Ответы с готовыми решениями:

Остановка потока по нажатию клавиши
Проблема такая: я создал 2 потока, в одном работает счетчик, в другом выводит значение. Нужно по...

Выполнение действия кнопки Button1 по нажатию клавиши "*"
как сделать что бы выполнялось действие кнопки Button1 по нажатию клавиши "*"

Остановка цикла по нажатию клавиши
Только начал осваивать эту задачу, может код и корявый, но не пойму, почему он не работает, мне...

Запуск\остановка цикла по нажатию клавиши
Всем привет! Вопрос как реализовать запуск и остановку цикла в консольном приложении по нажатию...

7
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
05.07.2014, 16:38 2
Xsenon156, попробуй как-то так

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.awt.event.*;
import javax.swing.*;
 
class Generate implements ActionListener, Runnable{
 
    private Thread t;
    private JLabel label;
    private boolean flag;
    private double value;
    
    public Generate(JLabel label) {
        
        flag = true;
        this.label = label;
        t = new Thread(this, "Thread");
        t.start();
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        
        myresume();
        label.setText(Double.toString(value));
        mysuspend();
    }
 
    @Override
    public void run() {
        
        try {
            
            while(true) {
                value = Math.random() * 100;
                
                synchronized(this) {
                    while(flag) {
                        wait();
                    }
                }
            }
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
    }
    
    public synchronized void myresume() {
        flag = false;
        notify();
    }
    
    public synchronized void mysuspend() {
        flag = true;
    }
}
 
public class Test {
    
    JFrame frame;
    JLabel label;
    JButton button;
    JPanel panel;
    
    public static void main(String[] args) {
        
        new Test().go();
    }
    
    public void go() {
        
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        label = new JLabel();
        panel = new JPanel();
        
        button = new JButton("Сгенерировать число");
        button.addActionListener(new Generate(label));
        
        panel.add(button);
        panel.add(label);
        
        frame.getContentPane().add(panel);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}
1
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 7
05.07.2014, 22:52  [ТС] 3
Цитата Сообщение от Yoghurt_92 Посмотреть сообщение
попробуй как-то так
Не совсем то, у меня есть программа которая выполняется, но на определенном этапе её выполнения, в цикле, мне нужно выводить информацию на экран по нажатии кнопки(т.е каждую итерацию цикла for по нажатии на кнопку) т.к. все происходит в одном потоке то информация обновляется только при выходе из функции, поэтому нужен второй поток только для действий в этом цикле.
0
Форумчанин
5958 / 4192 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.07.2014, 23:03 4
покажи часть кода,либо напиши упрощенную программу с такой же проблемой и выложи сюда.
0
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 7
06.07.2014, 16:05  [ТС] 5
Цитата Сообщение от WyPik Посмотреть сообщение
покажи часть кода,либо напиши упрощенную программу с такой же проблемой и выложи сюда.
Хорошо пример Yoghurt_92 // 32-37 строки
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.awt.event.*;
import javax.swing.*;
 
class Generate implements ActionListener, Runnable{
 
    private Thread t;
    private JLabel label;
    private boolean flag;
    private double value;
    
    public Generate(JLabel label) {
        
        flag = true;
        this.label = label;
        t = new Thread(this, "Thread");
        t.start();
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0) {
        
        myresume();
        label.setText(Double.toString(value));
        mysuspend();
    }
 
    @Override
    public void run() {
        
        try {
            
            while(true) { //Тут замена
                for(int i = 0; i < 10; i++)
                {
                    System.out.println(Integer.toString(i));
                    // И тут должно быть нажатие кнопки, и результатом должно быть 1->Click->2->Click  и т.д.
                }
                
                synchronized(this) {
                    while(flag) {
                        wait();
                    }
                }
            }
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
    }
    
    public synchronized void myresume() {
        flag = false;
        notify();
    }
    
    public synchronized void mysuspend() {
        flag = true;
    }
}
 
public class Test {
    
    JFrame frame;
    JLabel label;
    JButton button;
    JPanel panel;
    
    public static void main(String[] args) {
        
        new Test().go();
    }
    
    public void go() {
        
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        label = new JLabel();
        panel = new JPanel();
        
        button = new JButton("Сгенерировать число");
        button.addActionListener(new Generate(label));
        
        panel.add(button);
        panel.add(label);
        
        frame.getContentPane().add(panel);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}
Добавлено через 57 минут
И еще, в примере Yoghurt_92 при нажатии клавиши каждый раз создается новый поток, это тоже не мой случай(забыл исправить) ActionListener должен вызывать поток Generate, после выполнения одной итерации цикла for ставится на паузу, и по следующему клику мыши продолжатся, а не создавать еще 1 цикл на 10 итераций. С циклами и флагами идея хорошая, но что то у меня не получается.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
if(flag == false)
{
   flag = true
   for(int i = 0; i < 10; i++)
      {
              while(flag2)
               {
                      wait();
                }
               System.out.println(Integer.toString(i));    
      }
       flag = false;
}
Что то вроде этого...
0
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
06.07.2014, 17:23 6
Xsenon156, я показал суть, пример с флагами предлагается в книге Шилдта, и по мне, так удачно реализовано. Я подогнал под ваш вариант, показав способ, от которого бы сам плясал. Чтобы не создавать каждый раз поток, в класс отрисовки включите объект отвечающий за новый поток и генерацию рандомного числа, а потом юзайте его каждый раз при нажатии на кнопку.

Добавлено через 1 час 3 минуты
Xsenon156, что-то вроде этого?

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.awt.event.*;
import javax.swing.*;
 
class Generate implements Runnable {
 
    private Thread t;
    private boolean flag;
    private double value;
    
    public Generate() {
        
        flag = true;
        t = new Thread(this, "Thread");
        t.start();
    }
 
    @Override
    public void run() {
        
        try {
            
            for(int i = 0; i < 10; ++i) {
                
                value = Math.random() * 100;
                mysuspend();
                
                synchronized(this) {
                    while(flag) {
                        wait();
                    }
                }
            }
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
    }
    
    public double getValue() {
        return value;
    }
    
    public synchronized void myresume() {
        flag = false;
        notify();
    }
    
    public synchronized void mysuspend() {
        flag = true;
    }
}
 
public class Test implements ActionListener {
    
    JFrame frame;
    JLabel label;
    JButton button;
    JPanel panel;
    Generate generate;
    
    public static void main(String[] args) {
        
        new Test().go();
    }
    
    public void go() {
        
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        label = new JLabel();
        panel = new JPanel();
        
        button = new JButton("Сгенерировать число");
        button.addActionListener(this);
        
        generate = new Generate();
        
        panel.add(button);
        panel.add(label);
        
        frame.getContentPane().add(panel);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
            
        generate.myresume();
        label.setText(Double.toString(generate.getValue()));
    }
}
0
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 7
06.07.2014, 18:41  [ТС] 7
Цитата Сообщение от Yoghurt_92 Посмотреть сообщение
что-то вроде этого?
Вроде то но при попытки вынести кнопку ничего не получилось...
Это Алгоритм Крускала МОД Графа.
65 строчка отвечает за вывод дерева на экран.
При попытке привязать NewThreadClick( ActionListener), у вас это был Test к кнопке на фрэйме в другом классе ничего не выходит...
class Rebro и class KruskalRebros т.е. два последних имеют отношение непосредственно к алгоритму, на них можно не обращать внимания.
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package Kruscal;
 
import java.awt.event.*;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.Vector;
 
import javax.swing.*;
 
class Generate implements Runnable
{
 
    private Thread t;
    private boolean flag;
    private double value;
    //**************************************
    public int [][] Solve;
    public int Vex;
    public int [][] Mass;
    static public Scene Picture;
    TreeSet<Rebro> tree_solve = new TreeSet<Rebro>();
    
    public Generate(int Vex1, int[][] Mass_1, Scene Picture1)
    {
        Picture = Picture1;
        Vex = Vex1;
        Mass = Mass_1;
        
        flag = true;
        t = new Thread(this, "Thread");
        t.start();
    }
 
    @Override
    public void run()
    {
        TreeSet<Rebro> Rebros = new TreeSet<Rebro>();
        Solve = new int[Vex + 1][Vex + 1];
        
        for (int i = 1; i <= Vex; i++)
        {
            for (int j = i; j <= Vex; j++)
            {
                if((i != j) &&(Mass[i][j] != 0))
                {
                    Rebros.add(new Rebro(String.valueOf(i), String.valueOf(j), Mass[i][j]));
                }
            }
        }
        KruskalRebros vv = new KruskalRebros();
        //Rebros - все ребра
        //Rebro - текущее ребро
        for (Rebro Rebro : Rebros)
        {
            vv.insertRebro(Rebro);
        }
        
        try {
            
            for (Rebro Rebro : vv.getRebros())
            {
                 tree_solve.add(Rebro);
                 Solve[Integer.parseInt(Rebro.vertexA)][Integer.parseInt(Rebro.vertexB)] = Rebro.weight;
                 Solve[Integer.parseInt(Rebro.vertexB)][Integer.parseInt(Rebro.vertexA)] = Rebro.weight;
                 Picture.Add_Egde(Integer.parseInt(Rebro.vertexA), Integer.parseInt(Rebro.vertexB),Rebro.weight);
                 mysuspend();
                 
                 synchronized(this)
                 {
                    while(flag)
                    {
                        wait();
                    }
                }
            }
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
    }
    
    public double getValue() {
        return value;
    }
    
    public synchronized void myresume() {
        flag = false;
        notify();
    }
    
    public synchronized void mysuspend() {
        flag = true;
    }
}
 
public class NewThreadClick implements ActionListener {
    
   // JLabel label;
    //JButton button;
    //JPanel panel;
    Generate generate;
    //***********************************************
    private JFrame frame;
    private JTextArea textArea;
    private JScrollPane scroll;
    
    NewThreadClick(int Vex1, int[][] Mass_1, Scene Picture1)
    {
        frame = new JFrame();
        frame.setTitle("Infotmation about algorithm");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setBounds(50, 30, 800, 300);
        
        textArea = new JTextArea ();
 
        scroll = new JScrollPane (textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        textArea.append("Тестирую вывод сообщений !!!\n");
        
        frame.getContentPane().add(scroll);
        
        generate = new Generate(Vex1, Mass_1, Picture1);
        
        frame.setVisible(true);
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
            
        generate.myresume();
        //label.setText(Double.toString(generate.getValue()));
    }
}
 
class Rebro implements Comparable<Rebro>
{
    String vertexA, vertexB;
    int weight;
 
    public Rebro(String vertexA, String vertexB, int weight)
    {
        this.vertexA = vertexA;
        this.vertexB = vertexB;
        this.weight = weight;
    }
    public String getVertexA()
    {
        return vertexA;
    }
    public String getVertexB()
    {
        return vertexB;
    }
    public int getWeight()
    {
        return weight;
    }
    @Override
    public String toString()
    {
        return "(" + vertexA + ", " + vertexB + ") : Weight = " + weight;
    }
    public int compareTo(Rebro Rebro)
    {
        return (this.weight < Rebro.weight) ? -1: 1;
    }
}
class KruskalRebros
{
    Vector<HashSet<String>> vertexGroups = new Vector<HashSet<String>>();
    TreeSet<Rebro> kruskalRebros = new TreeSet<Rebro>();
 
    public TreeSet<Rebro> getRebros()
    {
        return kruskalRebros;
    }
    HashSet<String> getVertexGroup(String vertex)
    {
        for (HashSet<String> vertexGroup : vertexGroups)
        {
            if (vertexGroup.contains(vertex))
            {
                return vertexGroup;
            }
        }
        return null;
    }
    public void insertRebro(Rebro Rebro)
    {
        String vertexA = Rebro.getVertexA();
        String vertexB = Rebro.getVertexB();
 
        HashSet<String> vertexGroupA = getVertexGroup(vertexA);
        HashSet<String> vertexGroupB = getVertexGroup(vertexB);
 
        if (vertexGroupA == null)
        {
            kruskalRebros.add(Rebro);  
            
            if (vertexGroupB == null)
            {
                HashSet<String> htNewVertexGroup = new HashSet<String>();
                htNewVertexGroup.add(vertexA); 
                htNewVertexGroup.add(vertexB);
                vertexGroups.add(htNewVertexGroup);
            }
            else
            {
                vertexGroupB.add(vertexA);
            }
        }
        else
        {
            if (vertexGroupB == null)
            {
                vertexGroupA.add(vertexB);
                kruskalRebros.add(Rebro);
            }
            else
            {
                if (vertexGroupA != vertexGroupB)
                {
                    vertexGroupA.addAll(vertexGroupB);
                    vertexGroups.remove(vertexGroupB);
                    kruskalRebros.add(Rebro);
                }
            }
        }
    }
}
0
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
06.07.2014, 22:41 8
Xsenon156, что именно не выходит?
0
06.07.2014, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2014, 22:41
Помогаю со студенческими работами здесь

Остановка выполнения функции по нажатию клавиши
Делаю проект на С++, WinForms, в 2005 VS. По нажатию кнопки запускается функция (из отдельного...

Остановка сервера DNS по нажатию клавиши
Задача заключается в следующем. Нужно остановить сервер DNS по нажатию клавиши. Сервер установлен...

Выполнение действия по нажатию button
всем привет! столкнулся с проблемой! мне необходимо при нажатии на кнопку выполнение РНР скрипта,...

Выполнение действия по нажатию кнопки
Здравствуйте, дорогие программисты! Как сделать так в Windows Forms, чтобы при нажатие кнопки...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru