Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56

Разные потоки для вывода в TextArea

21.02.2021, 21:34. Показов 2488. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем привет!

Суть: делаю прогу для работы с дампами оракл. Хочу чтобы весь процесс выводился в моей проге в реальном времени
Проблема: до момента самого импорта все выводится хорошо, но на сомом импорте прога подвисает, выводов не происходит, а потом (видимо когда импорт произошел), вываливает сразу пачкой все то, что должно было попасть в TextArea

Пример лога
Кликните здесь для просмотра всего текста

21.02.2021 21:11:15 : Project: xxx
21.02.2021 21:11:15 : Check connection...
21.02.2021 21:11:17 : Connection is ready...
с этого места висим
21.02.2021 21:11:18 : File xxx-2021_02_16_154032.dmp
21.02.2021 21:11:18 : Copying the dump file...
21.02.2021 21:11:18 : Cleaning up the database...
21.02.2021 21:11:22 : Loading the dump C:\Temp\xxx-2021_02_16_154032.dmp
21.02.2021 21:11:22 : Preparing for import...
21.02.2021 21:11:22 : Start import...
21.02.2021 21:11:23 : "ABESYS_T" 29 rows
21.02.2021 21:11:23 : "ABE_T" 2 rows
21.02.2021 21:11:23 : "ABRECH_D" 0 rows
...
21.02.2021 21:11:49 : "WSBSYSSEL_T" 12 rows
21.02.2021 21:11:49 : Import completed!
21.02.2021 21:11:49 : Temporary files have been deleted.


Метод на кнопку:
Кликните здесь для просмотра всего текста

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
@FXML
    public void onClickImport() throws Exception {
        cleanLog();
        FileOperation fileOperation = new FileOperation();
        final FileChooser fileChooser = new FileChooser();
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("DMP files (*.dmp)", "*.dmp");
        fileChooser.setInitialDirectory(new File(fileOperation.getDIR()));
 
        fileChooser.getExtensionFilters().add(extFilter);
        DbOperation dbOperation = new DbOperation();
        Projects projects = new Projects();
        addLog("Project: " + projects.getUserByName(cBox.getValue()));
        addLog("Check connection...");
 
        try {
            if (dbOperation.getCheckConnection(cBox.getValue()))
            {
                addLog("Database connection error");
            }
            else
            {
                addLog("Connection is ready...");
 
                //До сюда лог выводится нормально, своевременно
 
                File file = fileChooser.showOpenDialog(primaryStage);
                if (file != null)
                {
                    addLog("File "+file.getName());
                    final File parentFolder = new File(file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(File.separator)));
                    String filePath = parentFolder.getAbsolutePath();
 
                    addLog("Copying the dump file...");
                    fileOperation.copyDir(filePath,fileOperation.getDIR(),file.getName());
                    addLog("Cleaning up the database...");
                    dbOperation.CleanDb(cBox.getValue());
 
                    addLog("Loading the dump " + file.getPath());
 
                    // а тут, видимо, подвисает...
 
                    startImport(file.getName());
                }
                else
                {
                    addLog("No file selected");
                    setButtonsEnabled(true);
                }
            }
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }


Метод startImport
Кликните здесь для просмотра всего текста

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
private void startImport(String fileName) throws IOException, SQLException {
        addLog("Preparing for import...");
        FileOperation fileOperation = new FileOperation();
        File file = fileOperation.CreateImpFile(cBox.getValue(),fileName);
        if (file != null)
        {
            addLog("Start import...");
 
                        ProcessBuilder builder = new ProcessBuilder(
                                "cmd.exe",
                                "/c",
                                "imp -parfile=c:\\temp\\" + cBox.getValue() + "_imp.par");
                        builder.redirectErrorStream(true);
                        Process p = builder.start();
                        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
                        String line;
                        StringBuilder lineToLog = new StringBuilder();
                        int sIdx,eIdx;
                        String s = "";
                        do {
                            line = r.readLine();
                            if (line != null && line.contains("import"))
                            {
                                line = line.replace(".", "").replace("  ", " ").trim() + " ";
                                lineToLog.append(line);
 
                                //addLog(lineToLog);
                                sIdx = lineToLog.indexOf("\"");
                                eIdx = lineToLog.lastIndexOf("rows");
                                if (sIdx > -1 && eIdx > -1)
                                {
                                    s = lineToLog.substring(sIdx, eIdx + 4);
                                    
                                    //этот вывод как раз и зависает
                                    addLog(s);
                                    s = "";
                                }
                            }
 
                            if (lineToLog.toString().contains("imported"))
                            {
                                lineToLog = new StringBuilder();
                            }
 
                        } while (line != null);
        }
 
        addLog("Import completed!");
    }
Java
1
 

Переадрессация вывода в TextArea сделан так
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void appendText(String valueOf) {
        Platform.runLater(() -> lTextArea.appendText(valueOf));
    }
 
    @Override
    public void initialize(URL location, ResourceBundle resources) {
      //пробовал тут новый поток сделать  
       Thread one = new Thread(() -> {
            OutputStream out = new OutputStream() {
                @Override
                public void write(int b) throws IOException {
                    appendText(String.valueOf((char)b));
                }
            };
            System.setOut(new PrintStream(out, true));
            System.setErr(new PrintStream(out, true));
        });
        one.start();
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2021, 21:34
Ответы с готовыми решениями:

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Потоки ввода-вывода. Работа с файлами Потоки ввода-вывода
Есть задача "Дан текстовый файл, содержащий таблицу из трех столбцов вещественных чисел. Ширина столбцов таблицы и способ их выравнивания...

Потоки ввода/вывода, файловые потоки
Объясните, пожалуйста, механизм считывания данных. Перелопатил кучу статей в интернете и всё равно не понял как это работает. Понял...

4
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
23.02.2021, 23:25
Лучший ответ Сообщение было отмечено mrkid как решение

Решение

mrkid, вынесите всё что в методе на копке в новый Thread
1
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56
26.02.2021, 23:47  [ТС]
Спасибо! помогло. только я обернул метод startImport(file.getName()); в новый поток.
0
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
01.03.2021, 00:34
mrkid, всегда оставляйте графику в главном потоке, а всё, что касается логики программы (ну всё, что надо, то есть "тяжёлое") выносите в новые потоки
1
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56
01.03.2021, 09:56  [ТС]
спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2021, 09:56
Помогаю со студенческими работами здесь

Работа с структурами: выполните, используя файловые потоки для ввода/вывода
Используя тип данных запись с именем PRICE, содержащую следующие поля: • TOVAR – название товара; • KOL – количество товара; • TSENA...

Сделать разные параметры вывода JS для разных браузеров
Всем привет. Столкнулся с такой проблемой: Есть скрипт слайдера. Если я подгоняю параметры чтобы ровно выводился слайдер в IE, то он...

Разные потоки
Пишу одну прогу, мне там нужно кое-что делать в несколько потоков, пайтон так умеет? Примерно надо 10-15 потоков. Как это реализовать? ...

Вывести результаты работы в разные потоки
Привет Всем. Нужна помощь в слудеющей задачи. у программы есть данные. На основе этих данных в разных потоках вывести какие то разные...

Как разные потоки обращаются к статическому члену
Здравствуйте. Вот парюсь с Web-сервисом, но основной код отрабатываю в обычном консольном приложении. Я сделал класс (статический) в нем...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru