powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / вызов progressMonitor из event thread
6 сообщений из 6, страница 1 из 1
вызов progressMonitor из event thread
    #33209895
akula84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема вот в чем.
По нажатию мышки вызываю метод.
Предположим такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   void  doShowTable(){
    SimulatedActivity sa =  new  SimulatedActivity( 100 );
    //SwingUtilities.invokeLater(sa);
    sa.start();
     try {
      sa.join();
    } catch (Exception ex){}
    showInfoMessage("Задание выполнено");
  }

класс SimulatedActivity
Код: plaintext
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.
   class  SimulatedActivity  extends  Thread{  
     public  SimulatedActivity( int  t){  
      current =  0 ;
      target = t;
    }

     public   int  getTarget(){  
       return  target;
    }
    
     public   int  getCurrent(){  
       return  current;
    }

     public   void  run()
    {  
       final  ProgressMonitor mon =  new  ProgressMonitor( null ,"тест","Осталось", 0 ,getTarget());
      mon.setMillisToDecideToPopup( 1  *  1000 );
       long  timeStart = System.currentTimeMillis();
      
       while  (current <= target){  
         try {  
          mon.setNote("Выполнено "+(current* 100 / this .getTarget()) +"% (обработано "+current+" строк из "+ getTarget()+")"+" Время работы "+(System.currentTimeMillis()-timeStart)/ 1000  + "сек.");
          mon.setProgress(current);
          System.out.println(current);
           if (mon.isCanceled()){
            mon.setProgress(getTarget());
             new  GUIHelper().showInfoMessage("Процесс прерван пользователем");
             break ;
          }
          sleep( 100 );
        } catch (Exception e){ return ;}
        current++;
      }
    }
    
     private   int  current;
     private   int  target;
  } 


Проблема вот в чем: надо чтобы сначала полностью выпоолнялся SimulatedActivity, а только потом выскакивало сообщение
showInfoMessage("Задание выполнено");
Происходит же следующее:
1) Если не писать в методе doShowTable join, то монитор нормально отображается, но и сообщение выскакивает до окончания работы(два потока выполняются параллельно, что правильно )
2) Если писать в методе doShowTable join, то монитор появляется, но на нем ничего не отображается, хотя выполнение задания идет, а потом приложение виснет.

Как сделать так, чтобы все корректно работало?
Заранее спасибо за помощь
...
Рейтинг: 0 / 0
вызов progressMonitor из event thread
    #33209944
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
метод showInfoMessage вообще убрать из метода doShowTable. После того, как ты запустил свой поток, нужно запустить таймер, в этом таймере нужно обращатся к потоку и проверять, завершил он работу или нет, если завершил, то таймер выводит сообщение "Задание выполнено". Соответсвенно в класс SimulatedActivity нужно добавить переменну , например isWorking типа булеан и методы доступа к ней из таймера, зачем эта переменная и что и когда ей присваивать думаю догадаешься...
...
Рейтинг: 0 / 0
вызов progressMonitor из event thread
    #33210163
Liner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя
Код: plaintext
showInfoMessage("Задание выполнено");
засунуть в run?
...
Рейтинг: 0 / 0
вызов progressMonitor из event thread
    #33210185
akula84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LinerА нельзя
Код: plaintext
showInfoMessage("Задание выполнено");
засунуть в run?

Это просто пример, не всегда из run будет доступен вызывающий класс

wessen,спасибо - все заработало.
...
Рейтинг: 0 / 0
вызов progressMonitor из event thread
    #33210188
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LinerА нельзя
Код: plaintext
showInfoMessage("Задание выполнено");
засунуть в run?
это не совсем правильно, так же создавать прогрессМонитор в каком то левом потоке тоже неправильно...
Правильно, создать поток (SimulatedActivity) и чтобы он занимался только вычислениями, и создать таймер, который брал бы из этого потока данные и управлял прогрессМонитором и выводм сообщения об окончании работы.
...
Рейтинг: 0 / 0
вызов progressMonitor из event thread
    #33584897
GlukOza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenметод showInfoMessage вообще убрать из метода doShowTable. После того, как ты запустил свой поток, нужно запустить таймер, в этом таймере нужно обращатся к потоку и проверять, завершил он работу или нет, если завершил, то таймер выводит сообщение "Задание выполнено". Соответсвенно в класс SimulatedActivity нужно добавить переменну , например isWorking типа булеан и методы доступа к ней из таймера, зачем эта переменная и что и когда ей присваивать думаю догадаешься...


Как узнать, завершил ли поток работу?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / вызов progressMonitor из event thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]