Форум программистов, компьютерный форум, киберфорум
JavaFX
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 90
1

Неразбериха в потоке

27.08.2018, 19:48. Просмотров 1156. Ответов 5

Доброго времени суток уважаемые форумчане! Я начинающий java программист, пишу сейчас своё приложение по парсингу данных VK. В настоящее время у меня возникла проблема, которую я не могу решить САМОСТОЯТЕЛЬНО. Все необходимые мне данные в программе считываются в потоке (ThreadProcess) и записываются в текстовые файлы, пути к которым скидываются в JFXTextArea. Данные, что записаны в этих файлах я хочу скинуть в таблицу (класс AboutTable), но если я это делаю в потоке, то программа вылетает с ошибкой. Я знаю что в потоке нельзя изменять элементы пользовательского интерфейса. В принципе проблему решил методом isAlive (создал бесконечный цикл и проверял законцил ли работу поток) но у меня стала зависать сама программа пока работал поток, а потом все прорывало и все прогрессбары ставились на 100% ... Поэтому это не решение проблемы. Хотел у Вас спросить как более лучше сделать мною задуманное. В принципе в потоке меняю прогрессбары и все работает норм, а с таблицей так не получается. В Delphi был метод synchronize, пробовал на java у меня ничего не получилось. Хотя и прогрессбаром в потоке управлять напрямую по-моему неправильно. Может кто подскажет как по уму все сделать - управлять с потока прогрессбаром и сбрасывать данные в таблицу. Заранее благодарю за оказанную помощь!



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
 
 
 
 @FXML
    void buttonclicled(MouseEvent event) {
        ThreadProcess th = new ThreadProcess();
        buttonOk.getScene().getWindow().hide();
        th.start();
    }
 
 
 
 
 // Поток по считыванию названий групп и запуска парсинга
    class ThreadProcess extends Thread {
        public void run() {
            FrendsGroup fg = new FrendsGroup();
            String result = new String();
            //Считываем список групп в строку
            String SpisokGroup = textgroup.getText();
            if (SpisokGroup.endsWith("\n") == false) {
                SpisokGroup += "\n";
            }
            //Цикл по считыванию групп
            while (!SpisokGroup.equals("")) {
                //Берем название группы
                String temp = SpisokGroup.substring(0, SpisokGroup.indexOf("\n") + 1);
                if (!temp.matches("https://vk.com/.*[\n]")) {
                    System.out.println("Выход!");
                    break;
                }
                //Удаляем обработанную строку их textGroup
                SpisokGroup = SpisokGroup.replace(temp, "");
                textgroup.setText(SpisokGroup);
                temp = temp.substring(temp.lastIndexOf("/") + 1, temp.lastIndexOf("\n"));
                if (temp.startsWith("club")) {
                    temp = temp.substring(temp.indexOf("club") + 4, temp.length());
                }
                System.out.println("temp=" + temp + "\n" + "SpisokGroup=" + SpisokGroup);
                //Отправляем на обработку
                try {
                    Thread.sleep(1000);
                    result = fg.frend(Authorization.token, String.valueOf(sort), temp + "&");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Получаем список пользователей
                textgroup.appendText(result + "\n"); //Сюда скидываются пути к файлам с данными
            }
 
            try {
               new AboutTable().About(trim(textgroup.getText()));
            }catch (Exception e){
 
            }
        }
    }
 
package sample;
 
import java.io.*;
 
import static org.apache.commons.lang3.StringUtils.trim;
 
 
//Отправка данных в таблицу и работа с прогрессьаром после выгрузки данных в файл методом FrendGroup
public class AboutTable {
    private String pn_number;
    private String ID;
    private String surname;
    private String username;
    private String sex;
    private String date_of_birth;
    private String hometown;
    private String phone_number;
    private String online_status;
    private double i;
 
 
    public double getI(){
        return i;
    }
 
    public void About(String filePath) throws Exception {
        String lineSeparator = System.getProperty("line.separator");
        menu_Controller.w.getSpinner2().setProgress(0);
        int znac = 0;
        Table table = new Table();
        table.starttable(menu_Controller.w.gettable());
        try {
            FileInputStream fstream = new FileInputStream(filePath);//Извлекаем из файла построчно JSON
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            double pr = countLines(filePath) / 100;
            String strLine;
            while ((strLine = br.readLine()) != null) {
                try {
                    znac++;
                    i = znac / pr / 100;
                    menu_Controller.w.getSpinner2().setProgress(i);
                    pn_number = trim(strLine.substring(0, strLine.indexOf(".")));
                    ID = trim(strLine.substring(strLine.indexOf(".") + 3, strLine.indexOf(" ", strLine.indexOf(".") + 3)));
                    username = trim(strLine.substring(strLine.indexOf(ID) + ID.length(), strLine.indexOf(" ", strLine.indexOf(ID) + ID.length() + 1)));
                    surname = trim(strLine.substring(strLine.indexOf(username) + username.length(), strLine.indexOf(" ", strLine.indexOf(username) + username.length() + 2)));
                    sex = trim(strLine.substring(strLine.indexOf(surname) + surname.length(), strLine.indexOf(" ", strLine.indexOf(surname) + surname.length() + 2)));
                    date_of_birth = trim(strLine.substring(strLine.indexOf(sex) + sex.length(), strLine.indexOf(" ", strLine.indexOf(sex) + sex.length() + 2)));
                    hometown = trim(strLine.substring(strLine.indexOf(date_of_birth) + date_of_birth.length(), strLine.indexOf(" ", strLine.indexOf(date_of_birth) + date_of_birth.length() + 2)));
                    phone_number = trim(strLine.substring(strLine.indexOf(hometown) + hometown.length(), strLine.indexOf(" ", strLine.indexOf(hometown) + hometown.length() + 2)));
                    trim(strLine);
                    strLine.replace(lineSeparator, "");
                    if (strLine.endsWith("Offline ")) {
                        online_status = "Offline";
                    } else if (strLine.endsWith("Online ")) {
                        online_status = "Online";
                    } else if (strLine.endsWith("Online_mobile ")) {
                        online_status = "Online_mobile";
                    }
                    table.addColl(pn_number, ID, username, surname, sex, date_of_birth, hometown,
                            phone_number, online_status);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            menu_Controller.w.getSpinner2().setProgress(1);
            fstream.close();
        } catch (IOException e) {
            System.out.println("Ошибка считывания из файла!");
        }
    }
 
    //подсчитываем кол-во строк в файле для прогрессбара
    private int countLines(String filename) throws IOException {
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
        try {
            byte[] c = new byte[1024];
            int count = 0;
            int readChars = 0;
            boolean empty = true;
            while ((readChars = is.read(c)) != -1) {
                empty = false;
                for (int i = 0; i < readChars; ++i) {
                    if (c[i] == '\n') {
                        ++count;
                    }
                }
            }
            return (count == 0 && !empty) ? 1 : count;
        } finally {
            is.close();
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2018, 19:48
Ответы с готовыми решениями:

неразбериха с файлами...
Даны два текстовых файла f1 и f2. Файл f1 содержит произвольный текст. Слова в тексте разделены...

Неразбериха с классами
Здравствуйте уважаемые гуру! Проблема вот в чем: Я создаю класс А из него наследую класс Б а вот...

Неразбериха с word'ом.
Ребята, не могу разобраться вообще. Я хочу напечатать документ, нажимаю кнопку принтера, а он мне...

неразбериха с toggle
Здравствуйте. У меня вот такая проблема - стал изучать jquery, столкнулся с методом toggle, но что...

5
405 / 276 / 92
Регистрация: 14.03.2017
Сообщений: 777
27.08.2018, 19:56 2
Лучший ответ Сообщение было отмечено Vadim00311 как решение

Решение

Уберите пожалуйста вашу реализацию isAlive
Используйте где угодно:
Java
1
Platform.runLater(() -> System.out.println("Hello World"));
Но будьте осторожны, он используется ТОЛЬКО для обработки FX компонентов. Иначе -> потеря производительности.

Пример:
Java
1
2
Button b = new Button();
Platform.runLater(() -> b.setText("Hello World"));
1
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 90
27.08.2018, 20:10  [ТС] 3
т.е. мне можно сделать так
Java
1
2
3
4
5
Platform.runLater(() ->
{
AboutTable ab = new AboutTable();
ab.about(trim(textgroup.getText));
}
и ошибки в потоке не будет?
0
405 / 276 / 92
Регистрация: 14.03.2017
Сообщений: 777
27.08.2018, 20:13 4
Vadim00311, не будет, но вы брезгуете моему совету.
используется ТОЛЬКО для обработки FX компонентов
0
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 90
27.08.2018, 20:15  [ТС] 5
Я вижу Вы разбираетесь в вопросе
А как тогда обработать сторонние компоненты, такие как JFXTreeTableView??
0
405 / 276 / 92
Регистрация: 14.03.2017
Сообщений: 777
27.08.2018, 20:31 6
Vadim00311, Так, и только так обработать:
Java
1
2
String result = computeBefore();
Platform.runLater(() -> component.setText(result));
Тоесть, старайтесь ничего стороннего в этом потоке - не вычислять.

По вашему примеру, примерно так, если в отдельном потоке (можете попробовать и без нового потока):
Java
1
2
3
4
5
6
7
8
new Thread(() -> {
    String[] result = new String[1];
    Platform.runLater(() -> result[0] = textgroup.getText());
    while (result[0] == null) {
    }
    AboutTable ab = new AboutTable();
    ab.about(trim(result[0]));
}).start();
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2018, 20:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Неразбериха с переменными
Смысл в том что при вводе в поле значение выводится в Label, но я ни как не могу разобраться с...

Неразбериха с классами
Собственно первую часть я кое-как осилил, а вот вторую не понимаю. Подскажите пожалуйста, как это...

В case неразбериха....
int wag = 1; ... int auth = Application-&gt;MessageBox(String(&quot;Заполнить поля&quot;).w_str(),...

Неразбериха с VKNet
Здравствуйте! Не знаю даже как правильно описать проблему, по порядку: Возникло желание написать...


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

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

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