Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окно индикации выполнения 
V
    Опции темы
diablero
Дата 6.3.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



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

Но при создании класса, у меня возникли проблемы.
Опишу что должно получитсья:
Пользователь выбирает какое-то действие,  например импорт данных, выводится модальное окно, с прогрессбаром.
Выполняется импорт данных, окно разрушается. Этот класс я хочу использовать во всех подобных слачаях.

А теперь вопросы:
Как получить доступ к BoundedRangeModel, когда для окна создается отдельный поток?
Как в моем случае правильно уничтожить поток?

Или я что-то не так делаю? Подскажите. 


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
LSD
Дата 6.3.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(diablero @  6.3.2007,  18:01 Найти цитируемый пост)
Как получить доступ к BoundedRangeModel, когда для окна создается отдельный поток?

Так же как и в любом другом случае: getModel(). Надо только смотреть чтобы модель при оповещении слушателей использовала SwingUtilities.invokeLater().


Цитата(diablero @  6.3.2007,  18:01 Найти цитируемый пост)
Как в моем случае правильно уничтожить поток?

Просто выйди из метода run() и поток завершиться.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nornad
Дата 6.3.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



Цитата(LSD @  6.3.2007,  21:45 Найти цитируемый пост)
Просто выйди из метода run() и поток завершиться.

Думаю, diablero имел в виду, что не видит способа завершить поток снаружи.
Вообще, как я понял, специальных методов принудительного убиения уже не осталось (точнее, они есть, но они deprecated ибо грех). Чтобы снаружи завершить поток я, например, использовал сигнальный объект, на котором регулярно синхронизировался код в потоке. Когда нужно было завершить поток, я менял значение объекта на сигнальное. Поток это через некоторое время обнаруживал и завершался (выход из run, как и советует LSD).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
diablero
Дата 6.3.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Чего-то у меня ничего не выходит.

Приведите пример, коркас из методов.


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
nornad
Дата 7.3.2007, 03:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 6
Всего: 31



В методе run:
Код

private Boolean signal;
public void run() {
  // что-то делаем
  synchronize( signal ) {
    if ( signal == true ) return;
  }
  // что-то делаем
}

Где-то снаружи (откуда надо завершить поток):
Код

  threadCloseSignal = true;

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

Это сообщение отредактировал(а) nornad - 7.3.2007, 03:40


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
LSD
Дата 7.3.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Только не Boolean, а boolean, а еще лучше AtomicBoolean.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
diablero
Дата 7.3.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Код

import javax.swing.*;

public class ProgressBarWindows {
    private final BoundedRangeModel model = new DefaultBoundedRangeModel(0,0,0,100);

    public ProgressBarWindows() {
        Thread process = new Thread(new Runnable() {
            public void run() {
                JProgressBar progress = new JProgressBar(model);
                progress.setStringPainted(true);
                JPanel progressPanel = new JPanel();
                progressPanel.add(progress);

                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setUndecorated(true);

                dialog.getContentPane().add(progressPanel);
                dialog.setSize(300, 100);
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);
            }
        });
        process.start();
    }
    public void setInt(int value) {
        synchronized(model){
            model.setValue(value);
        }
        if(value==100) {
        // тут должен уничтожаться диалог и процесс
        }
    }
}


Почти работает.  Осталось только все уничтожить, причем так работает при условии, что model определена при объявлении.
Пока туплю



--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
LSD
Дата 8.3.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Нет, не так.
Код
public class ProgressBarWindows
{
  private BoundedRangeModel model;
  private JDialog dialog;

  public void showProgressBarWindow(BoundedRangeModel m)
  {
    this.model = m;
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        JProgressBar progress = new JProgressBar(model);
        progress.setStringPainted(true);
        JPanel progressPanel = new JPanel();
        progressPanel.add(progress);

        dialog = new JDialog();
        dialog.setModal(true);
        dialog.setUndecorated(true);

        dialog.getContentPane().add(progressPanel);
        dialog.setSize(300, 100);
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
      }
    });
  }

  public void hideProgressBarWindow()
  {
    if(dialog != null)
    {
      dialog.dispose();
      dialog = null;
      model = null;
    }
  }

  public void setInt(final int value)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        model.setValue(value);
        if(value == 100)
          hideProgressBarWindow();
      }
    });
  }
}

А для вычислительного процесса создаешь отдельный поток, и из него вызываешь методы showProgressBarWindow(), hideProgressBarWindow() и setInt().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
diablero
Дата 8.3.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Спасибо

Поставте LSD от меня +1




--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
powerOn
Дата 8.3.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(diablero @  8.3.2007,  09:51 Найти цитируемый пост)
Поставте LSD от меня +1

без проблем.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
diablero
Дата 8.3.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Час от часу не легче. Теперь встал вопрос синхронизации.

Создаю вычислительный процесс в отдельном потоке, из него работаю с ProgressBarWindows. 
Вычислительный процесс должен вернуть результат.

Тут то и возникла проблема. Как дождаться результата.

Код

Import imp = new Import(...)
...
data = import.getData(); // ???






--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
powerOn
Дата 8.3.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



используй метод join() класса Thread для ожидания завершения потока.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
diablero
Дата 8.3.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата

используй метод join() класса Thread для ожидания завершения потока.

как?


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
powerOn
Дата 8.3.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(diablero @  8.3.2007,  23:12 Найти цитируемый пост)
как? 

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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
diablero
Дата 9.3.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Это пример класса, будет использоваться ProgressBarWindows
Код

import javax.swing.*;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;

public class ImportOfCSVFile
{
    private HashMap <String, String[]> dataMap;

    public ImportOfCSVFile(String description, String title) {

        ImageFilesFilter filesFilter = new ImageFilesFilter();
        JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
        fileChooser.setAcceptAllFileFilterUsed(false);
        filesFilter.setFilterParametrs(description, new String[]{"csv", "CSV"});
        fileChooser.addChoosableFileFilter(filesFilter);
        fileChooser.setDialogTitle(title);

        int res = fileChooser.showOpenDialog(null);
            if (res == JFileChooser.APPROVE_OPTION) {
                startImport(fileChooser.getSelectedFile().getPath());
            }
    }
    private void startImport(final String filePath) {
        Thread process = new Thread(new Runnable()
        {
            public void run()
            {
                ProgressBarWindows pw = new ProgressBarWindows(new DefaultBoundedRangeModel(0,0,0,100), "Import data");
                try {
                    pw.showProgressBarWindow();

                    int lineCount = getLineCount(filePath);
                    if(lineCount==0) throw new Exception("Error. \""+filePath+"\" is empty");
                    dataMap = new HashMap<String, String[]>(lineCount);

                    int onepr = lineCount/100;
                    FileInputStream inputStream = new FileInputStream(filePath);
                    BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream));
                    String readString, key;
                    String []data;
                    int index = 0, count = 0;
                    while((readString = bufReader.readLine())!=null){
                        readString = readString.trim();
                        if(readString.length()==0)
                        continue;

                        key = readString.substring(0, readString.indexOf(";"));
                        if(key.length()==0) continue;
                        index++;
                        if(index==onepr){
                            count++;
                            pw.setProgressValue(count);
                            index = 0;
                        }
                        readString = readString.substring(key.length()+1, readString.length());
                        readString+=" ; ; ; ; ; ; ; ; ; ; ; ;";
                        data = readString.split(";");
                        dataMap.put(key, data);
                    }
                    bufReader.close();
                    inputStream.close();
                    pw.setProgressValue(100);

                }
                catch(Exception err){
                    dataMap = null;
                    pw.hideProgressBarWindow();
                }
            }
        });
        process.start();
    }
    private int getLineCount(String filePath) {
        int count = 0;
        try {
            FileInputStream inputStream = new FileInputStream(filePath);
            BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream));

            while(bufReader.readLine()!=null){
                count++;
            }
            bufReader.close();
            inputStream.close();
        }
        catch(Exception err){
            count = 0;
        }
        return count;
    }
    public HashMap <String, String []> getDataMap(){

        return dataMap;
    }
}


Пользуюсь так:
Код

ImportOfCSVFile importOfCSVFile = new ImportOfCSVFile(description,icsvTitle);
HashMap <String, String []>dataMap = importOfCSVFile.getDataMap();






--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.