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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с многопоточностью 
V
    Опции темы
rlepricon
Дата 9.11.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет.

Пишу апплет, который будет реализовывать игру "жизнь".

вот код:

Код

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

import java.io.*;


public class HelloWorld extends Applet implements MouseListener, MouseMotionListener, Runnable {
    
    byte pool[][];
    int maxX = 300;
    int maxY = 300;
    boolean startButton;
    
    Thread lifeThread;
    
    public void init() {
        setSize(400,300);
        setBackground(Color.gray);
        
        pool = new byte [30][30];
        for(byte i=0; i < 30; i++) {
            for(byte j=0; j< 30; j++) {
                pool[i][j] = 0;
            }
        }
        
        addMouseListener(this);
        addMouseMotionListener(this);
        
        startButton = false;    
    }
    
    public void start() {
        lifeThread = new Thread(this);
        lifeThread.start();
    }
    
    public void paint (Graphics g) {
        
        // объявление переменных
        Color upColor;
        Color downColor;
        
        Font boldFont = new Font("TimesRoman", Font.BOLD, 14);
        Font normalFont = new Font("TimesRoman", Font.PLAIN, 14);;
        Font textFont = normalFont;
        
        Font currentFont = normalFont;
        Color currentColor = Color.black;
        
        // прорисовка сетки
        for(int i = 0; i <= maxX; i = i+10) {
            g.drawLine(i, 0, i, maxY);
            g.drawLine(0, i, maxX, i);
        }
        
        // закрашивание квадратиков, в зависимости от значение элемента массива
        for(byte i=0; i < 30; i++) {
            for(byte j=0; j< 30; j++) {
                if (pool[i][j] == 1) {
                    g.setColor(Color.red);
                    int fillX = i*10;
                    int fillY = j*10;
                    g.fillRect(fillX+1, fillY+1, 9, 9);
                    g.setColor(Color.black);
                }
            }
        }
        
        // сохранение текущих значений цвета кисти и шрифта
        currentFont = g.getFont();
        currentColor = g.getColor();
        
        // определение реакции на кнопку startButton
        if (startButton == true) {
            upColor = Color.black;
            downColor = Color.white;
            textFont = normalFont;
        } else {
            upColor = Color.white;
            downColor = Color.black;
            textFont = boldFont;
        }
        
        // прорисовке кнопки startButton
        g.setColor(upColor);
        g.drawLine(320, 20, 320, 50);
        g.drawLine(320, 20, 380, 20);
        g.setColor(downColor);
        g.drawLine(320, 50, 380, 50);
        g.drawLine(380, 20, 380, 50);
        g.setFont(textFont);
        g.setColor(Color.black);
        g.drawString("Start", 330, 40);
        
        // восстановление значений цвета кисти и шрифта
        g.setColor(currentColor);
        g.setFont(currentFont);
        
    }
    
    public void mouseClicked(MouseEvent me) {
        int ClickedX = me.getX();
        int ClickedY = me.getY();
        
        if ((ClickedX <= 300)&&(ClickedY <= 300)&&(startButton == false)) {
            int poolX = (int) ClickedX/10;
            int poolY = (int) ClickedY/10;
        
            if (pool[poolX][poolY] == 0) {
                pool[poolX][poolY] = 1;
            } else {
                pool[poolX][poolY] = 0;
            }
        }
            
        if ((ClickedX > 320)&&(ClickedX < 380)&&(ClickedY > 20)&&(ClickedY < 50)) {
            if (startButton == false) {
                startButton = true;
            } else {
                startButton = false;
            }
        }
            
        repaint();

        me.consume();
    }
    
    
    
    public void run() {
        try {
            while(true) {
                if (startButton == true) {
                
                    // первый проход по массивы
                    for(int i=0;i<30;i++) {
                        for(int j=0;j<30;j++) {
                            for(int n=i-1;n<=i+1;n++) {
                                for(int m=j-1;m<=j+1;m++) {
                                    if (n < 0) { n = 29; }
                                    if (m < 0) { m = 29; }
                                    if (n > 29) { n = 0; }
                                    if (m > 29) { m = 0; }
                                    if (pool[n][m] == 1) {
                                        pool[i][j] = (byte) (pool[i][j] + 10);
                                    }
                                }
                            }
                        }
                    }
            
                    // второй проход по массиву
                    for(int i=0;i<30;i++) {
                        for(int j=0;j<30;j++) {
                            if (pool[i][j] < 20) { pool[i][j] = 0; }
                            if ((pool[i][j] > 20)&&(pool[i][j] < 30)) { pool[i][j] = (byte) (pool[i][j] - 20); }
                            if ((pool[i][j] == 30)||(pool[1][j] == 31)) { pool[i][j] = 1; }
                            if (pool[i][j] > 31) { pool[i][j] = 0; }
                        }
                    }    
                    repaint();
                }
            }
            lifeThread.sleep(1);
        }
        catch (InterruptedException e) { }
    }

    
}


Поле рисуется, возможно установить клетки на поле, но расчёт и соответсвенно обновление поля не происходит :-(.

Помогите разобраться, плиз.

Я думаю, что где-то накосячил с потоком, в котором выполняется расчёт, но не могу понять где.

Спасибо. 


PM MAIL   Вверх
LSD
Дата 12.11.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Этот код даже не компилируется.


--------------------
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   Вверх
rlepricon
Дата 14.11.2009, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Странно, у меня на эклипсе компилиться, но работает не так как надо...

а какую ошибку выдаёт при компиляции?
PM MAIL   Вверх
LSD
Дата 14.11.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



1. Не реализованы методы интерфейсов MouseListener и MouseMotionListener.

2. В методе run() строка lifeThread.sleep(1); недостижима, т.к. у тебя цикл бесконечный.


--------------------
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   Вверх
rlepricon
Дата 15.11.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот с методом run()  у меня как раз вопросы и есть, как его нужно правильно писать...

по поводу событий от мышки буду разбираться

Спасибо smile
PM MAIL   Вверх
LSD
Дата 16.11.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(rlepricon @  15.11.2009,  00:01 Найти цитируемый пост)
Вот с методом run()  у меня как раз вопросы и есть, как его нужно правильно писать...

Для начала, так чтобы он хотя бы компилировался smile


--------------------
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   Вверх
rlepricon
Дата 20.11.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо smile разобрался smile

В методе run() совсем забыл про synchronize()  smile
PM MAIL   Вверх
rlepricon
Дата 23.11.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дабы не создавать новую тему спрошу тут:
1. Несколько модифицировал апплетик, чтобы при прорисовке не было моргания, после чего в браузерах апплет стал виснуть :-( хотя в эклипсе всё нормально работает.

Код

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

import java.io.*;


public class HelloWorld extends Applet implements MouseListener, MouseMotionListener, Runnable {
    
    byte pool[][];
    int poolLength = 40;
    boolean startButton;
    int poolLength10 = 0;
    Image Buffer;
    Graphics Buffg;
    
    Thread lifeThread = null;
    
    public void init() {
        poolLength10 = poolLength*10;
        setSize(poolLength10+100,poolLength10+1);
        Buffer = createImage(poolLength10+100,poolLength10+1);
        Buffg = Buffer.getGraphics();
        setBackground(Color.gray);
        
        pool = new byte [poolLength][poolLength];
        for(byte i=0; i < poolLength; i++) {
            for(byte j=0; j< poolLength; j++) {
                pool[i][j] = 0;
            }
        }
        
        addMouseListener(this);
        addMouseMotionListener(this);
        
        startButton = false;    
        
        DrawScreen();
    }
    
    public void start() {
        lifeThread = new Thread(this);
        lifeThread.start();
    }
    
    
    public void DrawScreen() {
        
        Buffg.setColor(Color.gray);
        Buffg.fillRect(0, 0, poolLength10+100, poolLength10+1);
        Buffg.setColor(Color.black);
        // объявление переменных
        Color upColor;
        Color downColor;
        
        Font boldFont = new Font("TimesRoman", Font.BOLD, 14);
        Font normalFont = new Font("TimesRoman", Font.PLAIN, 14);;
        Font textFont = normalFont;
        
        Font currentFont = normalFont;
        Color currentColor = Color.black;
        
        // прорисовка сетки
        for(int i = 0; i <= (poolLength10); i = i+10) {
            Buffg.drawLine(i, 0, i, poolLength10);
            Buffg.drawLine(0, i, poolLength10, i);
        }
        
        // закрашивание квадратиков, в зависимости от значение элемента массива
        for(byte i=0; i < poolLength; i++) {
            for(byte j=0; j< poolLength; j++) {
                if (pool[i][j] == 1) {
                    Buffg.setColor(Color.red);
                    int fillX = i*10;
                    int fillY = j*10;
                    Buffg.fillRect(fillX+1, fillY+1, 9, 9);
                    Buffg.setColor(Color.black);
                }
            }
        }
        
        // сохранение текущих значений цвета кисти и шрифта
        currentFont = Buffg.getFont();
        currentColor = Buffg.getColor();
        
        // определение реакции на кнопку startButton
        if (startButton == true) {
            upColor = Color.black;
            downColor = Color.white;
            textFont = normalFont;
        } else {
            upColor = Color.white;
            downColor = Color.black;
            textFont = boldFont;
        }
        
        // прорисовке кнопки startButton
        Buffg.setColor(upColor);
        Buffg.drawLine(poolLength10+20, 20, poolLength10+20, 50);
        Buffg.drawLine(poolLength10+20, 20, poolLength10+80, 20);
        Buffg.setColor(downColor);
        Buffg.drawLine(poolLength10+20, 50, poolLength10+80, 50);
        Buffg.drawLine(poolLength10+80, 20, poolLength10+80, 50);
        Buffg.setFont(textFont);
        Buffg.setColor(Color.black);
        if (startButton == true) {
            Buffg.drawString("Stop", poolLength10+30, 40);
        } else {
            Buffg.drawString("Start", poolLength10+30, 40);
        }
        
        // восстановление значений цвета кисти и шрифта
        Buffg.setColor(currentColor);
        Buffg.setFont(currentFont);
    }
    
    public void update (Graphics g) {
        g.drawImage(Buffer, 0, 0, this);
    }
    
    public void paint (Graphics g) {
        update(g);
    }
    
    public void mouseClicked(MouseEvent me) {
        int ClickedX = me.getX();
        int ClickedY = me.getY();
        
        if ((ClickedX <= poolLength10)&&(ClickedY <= poolLength10)&&(startButton == false)) {
            int poolX = (int) ClickedX/10;
            int poolY = (int) ClickedY/10;
        
            if (pool[poolX][poolY] == 0) {
                pool[poolX][poolY] = 1;
            } else {
                pool[poolX][poolY] = 0;
            }
        }
            
        if ((ClickedX > poolLength10+20)&&(ClickedX < poolLength10+80)&&(ClickedY > 20)&&(ClickedY < 50)) {
            if (startButton == false) {
                startButton = true;
            } else {
                startButton = false;
            }
        }
        
        DrawScreen();
        repaint();

        me.consume();
    }
    
    // Заглушки для неиспользуемых событий от мыши
    public void mouseEntered( MouseEvent me ) { }
    public void mouseExited( MouseEvent me ) { }
    public void mousePressed( MouseEvent me ) { }
    public void mouseReleased( MouseEvent me ) {  }
    public void mouseMoved( MouseEvent me ) { }
    public void mouseDragged( MouseEvent me ) { }
    
    
    
    public void run() {
        System.out.println("Step in RUN");
        try {
            while(true) {
                System.out.println("Step in cicle");        
                if (startButton == true) {
                    System.out.println("Step in ALGO");
                    System.out.println("First step...");
                    
                    // первый проход по массивы
                    for(int i=0;i<poolLength;i++) {
                        for(int j=0;j<poolLength;j++) {
                            if ((pool[i][j]%10) == 1) {
                                for(int n=(i-1);n<=(i+1);n++) {
                                    for(int m=(j-1);m<=(j+1);m++) {
                                        int tmpX = n, tmpY = m;
                                        if (tmpX < 0) { tmpX = poolLength-1; }
                                        if (tmpY < 0) { tmpY = poolLength-1; }
                                        if (tmpX > poolLength-1) { tmpX = 0; }
                                        if (tmpY > poolLength-1) { tmpY = 0; }
                                        if (!((tmpX == i)&&(tmpY == j))) {
                                            pool[tmpX][tmpY] = (byte) (pool[tmpX][tmpY] + 10);
                                        }
                                    }                        
                                }
                            }
                        }
                    }
                    
                    System.out.println("Second step...");
                    // второй проход по массиву
                    for(int i=0;i<poolLength;i++) {
                        for(int j=0;j<poolLength;j++) {
                            int expression = (int) (pool[i][j]/10);
                            if ((expression==2)||(expression==3)) {
                                pool[i][j] = (byte) (pool[i][j]%10);
                            }
                            if ((expression<2)||(expression>3)) {
                                pool[i][j] = 0;
                            }
                            if (expression==3) {
                                pool[i][j] = 1;
                            }
                        }
                    }
                    
                    System.out.println("Repaint...");
                    synchronized(this) {
                        notify();
                    }
                    lifeThread.sleep(500);
                    DrawScreen();
                    repaint();
                }
            }
        }
        catch (InterruptedException e) { }
    }

    
}



Помогите разобраться, почему перестало работать?
PM MAIL   Вверх
rlepricon
Дата 23.11.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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