powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Грабли в аплете с отдельным потоком
4 сообщений из 4, страница 1 из 1
Грабли в аплете с отдельным потоком
    #32537519
swerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!!!
У меня грабли с аплететом, который имеет отдельный поток.
Отдельный поток управляет перерисовкой анимации. В данном случае это набор произвольных прямоугольников разного цвета.
Проблемы:
1)Хочу чтобы поток останавливался при сворачивании окна броузера и продолжал работу при его разворачивании. По логике надо использовать метода start, stop аплета и соответствующие методы потока.
Может быть вместо метода stop лучше использовать метод interrupt?!!
Грабли №1.

2)При нажатии любой клавиши, чтобы поток останавливался, а при повторном вновь продолжал работать. Для этого я написал метод listnerControl. Проблема - после его вызова поток уже никогда не стартует :-(((
И чего я только не делал (плачу горькими слезами...)
Грабли №2

При тестированнии сего экзЯмпляра (если кто на это решиться), не забудьте перед нажатием кнопки клавиатуры передать фокус на аплет щелчком мышки.


Код: 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.
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.
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Test extends Applet
{
       int width1 =  600 , height1 =  500 ;

       Thread animator = null;
       Image buffer;

       int index =  0 ;

       public void init()
       {
             buffer = createImage( width1, height1 );
             repaintApplet();

             try
             {
                   animator = (new Thread() {
                         public void run()
                         {
                               for(;;)
                               {
                                    try
                                    {
                                          index++;
                                          Thread.sleep(  1000  );
                                          repaintApplet();

                                    } catch ( InterruptedException e ) { }
                               }
                         }
                   });
                   animator.setPriority( Thread.MIN_PRIORITY );
                   
                   addKeyListener(new KeyListener(){
                         public void keyPressed(KeyEvent e)
                         {
                               listnerControl();
                               showStatus("KeyListener: Action at "+(new Date()).toString());
                         }
                         public void keyTyped(KeyEvent e){}
                         public void keyReleased(KeyEvent e){}
                   });
             }
             catch ( Exception e ) { System.out.println(e.getMessage()); }

       }
       public void paint(Graphics g)
       {
             getGraphics().drawImage(buffer,  0 ,  0 , width1, height1, this);
       }
       public synchronized void repaintApplet()
       {
             Graphics g = buffer.getGraphics();
             for(int i= 1 ;i< 100 ;i++)
             {
                  Color color=new Color((int)(Math.random()* 16000000 ));
                  g.setColor(color);
                  g.fillRect((int)(Math.random()*width1),(int)(Math.random()*height1),(int)(Math.random()*width1),(int)(Math.random()*height1));
             }
             g.fillRect( 0 , 0 , 60 , 40 );
             g.setColor(Color.black);
             g.drawString(Integer.toString(index), 30 , 30 );
             getGraphics().drawImage(buffer,  0 ,  0 , width1, height1, this);
       }

       boolean flag=true;
       public void listnerControl()
       {
             if(animator!=null)
             {
                   //if(!animator.interrupted())
                   //if(animator.isAlive())
                   if(flag)
                         //animator.interrupt();
                         animator.stop();
                   else 
                         animator.start();
                   flag = !flag;
             }
       }

       public void start()
       {
             if((animator!=null)&&(!animator.isAlive()))
                   animator.start();
       }
       public void stop()
       {
             if(animator!=null) 
                   animator.interrupt();
       }
       public void destroy()
       {
             if((animator!=null)&&(animator.isAlive()))
                   animator.interrupt();
             animator = null;
       }

}

Для ленивых даже HTML-файл:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0">
<HTML>
    <HEAD>
        <TITLE> Test </TITLE>
    </HEAD>
    <BODY>
        <APPLET   code="Test.class"    width="800"   height="600"></APPLET>
    </BODY>
</HTML>
...
Рейтинг: 0 / 0
Грабли в аплете с отдельным потоком
    #32540022
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
getGraphics() вызывается не оправданно, в конце концов схлопочешь NullPointerException, когда юзер будет релоадить страницу :)
В методе repaintApplet() вместо getGraphics().drawImage(buffer, 0, 0, width1, height1, this); должен стоять repaint(); Так же, было бы разумным взять в
synchronized() блок часть кода, где перерисовывется buffer. Маловероятно, что метод paint(g) будет вызван в этот промежуток времени, но от греха по дальше :)

Реализация обработки interrupt() лежит на авторе приложения. Поэтому если решил им пользоваться, то и обрабатывай правильно. Собственно, раз метод stop() стал deprecated, то другого выхода и нет :)
Можно таким образом:
Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
                   for(;;)
                   {
                        try
                        {
                              Thread.sleep( 1000 );
                              index++;
                              repaintApplet();

                        } catch ( InterruptedException e ) {
                              interrupt(); //restore interrupt status.
                        }
                        if (interrupted()) break; 
                   }




Но самое забавное, что повторные вызовы метода start() не будут вызывать метод run() :) Нет времени проверять баг это или фича под разными JDK, но раз так себя ведёт 1.4.2_04, то придётся это поддерживать :)
Самый простой подход создавать заново Thread и запускать его, вместо старого.


Правда, можно не использовать все эти start/stop/interrupt, а реализовать класс Thread расширив его методами stopRepaint/startRepaint/stopThread и реализовав эту логику в методе run();


public void stopRepaint() {
repaint = false;
}
public void startRepaint() {
repaint = true;
}

вместо
repaintApplet();
if (reapint) repaintApplet();

public void stopThread() {
interrupt();
}
...
Рейтинг: 0 / 0
Грабли в аплете с отдельным потоком
    #32542710
swerg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО!!!
1)NotGonnaGetUs,Вы правы насчет исключения при релоде страницы. Я то не как не мог понять, откуда ноги растут.

2)при вызове repain всегда происходит прорисовка фона изображения, отсюда мерцание при анимации...
Может есть какие-либо идеи, как боротся с прорисовкой фона аплета?
...
Рейтинг: 0 / 0
Грабли в аплете с отдельным потоком
    #32544043
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переопределить метод update(g)
по дефолту он заливает старое изображение и передаёт управление в метод paint(g).
попробуй простую замену:
public void update(g){
paint(g);
}
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Грабли в аплете с отдельным потоком
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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