|
Программирование Вопросы связанные с программированием в JAVA |
13.07.2006, 02:55
|
#1
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
TimerTask
Короче или это ошибка или хз
из Класса который загружен как TimerTask и подвешан на таймер (из метода run()) нельзя вызвать метод какогонить другого класса... при попытке вызова все виснет...
в чем ошибка?
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
13.07.2006, 14:05
|
#2
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Все вызывается и работает. Просто надо помнить что это другой процесс. Нельзя вызывать одни и те же методы одновременно из разных процессов, если это требуется пиши public synchronized void metodName()
И еще задача должна успеть выполниться до следующего ее вызова по таймеру иначе действительно приложение вылетит в трубу.
|
(Offline)
|
|
13.07.2006, 14:24
|
#3
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
хммм... не работает...
код: Main.java
import java.io.IOException;
import java.util.*;
import java.util.Random;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Main extends MIDlet implements CommandListener {
public Main midlet = this;
public Display MD = null;
public boolean Started=false;
public Timer timer = null;
public GameC GC = null;
public Graphics MG = null;
public MainLoop ML = null;
public Stages Stage = null;
public LayerC LC = null;
public Image MainTileSet = null;
int i,j;
public void startApp() {
GC= new GameC();
GC.CreateScreen();
MG = GC.CreateScreen();
Display.getDisplay(this).setCurrent(GC);
MG.setColor(200,200,50);
MG.fillRect(0,0,100,100);
GC.flushGraphics();
GC.addCommand(new Command("Exit", Command.EXIT, 1));
GC.setCommandListener(this);
Stage = new Stages();
try {
MainTileSet = Image.createImage("/Tileset Map11.png");
} catch (IOException ex) {
ex.printStackTrace();
}
LC = new LayerC(19,19,MainTileSet,16,16);
for(i=0;i<Stage.TestStageX;i++) for(j=0;Stage.TestStageY<19;j++) {
LC.setCell(i,j,Stage.TestStage [j][i]);
}
TimerTask TT = new MainLoop();
timer = new Timer();
timer.schedule( TT, 0, 1000 );
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command command, Displayable displayable) {
if (command.getCommandType() == Command.EXIT) {
destroyApp(true);
notifyDestroyed();
}
}
public void PAll() {
}
}
class MainLoop extends TimerTask {
public static GameC GC = null;
public static Display MD = null;
public static Graphics MG = null;
public static LayerC LC = null;
int i=0,j=0;
public static Main midlet = null;
public void pall() {
}
public void run() {
// LC.paint(MG);
System.out.println(3);
GC.PAll();
}
}
в классе GameC:
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.Graphics;
public class GameC extends GameCanvas {
int i=0,j=0;
public static GameC GC = null;
public static Display MD = null;
public static Graphics MG = null;
public static LayerC LC = null;
public GameC() {
super(true);
}
public Graphics CreateScreen() {
return getGraphics();
}
public synchronized void PAll() {
//MG = getGraphics();
//MG.setColor(200,200,50);
//i++;
//if (i>10) {i=0;j++;}
//if (j>10) {i=0;j=0;}
//MG.fillRect(i,j,10,10);
//flushGraphics();
}
}
короче виснет даже на вызове ПУСТОГО метода... даже midlet.PAll(); виснет... только если такой создаешь в самом классе таймера, тогда робит, но если потом из него опять ченить вызываешь все виснет
ммдя... как я уже 100 раз говорил Маркс с Энгельсом пролетают по полной по напрягу умственной деятельности... они на яве никогда не кодили, ламо блин ушастые...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
13.07.2006, 21:33
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Надо либо делать метод статичным:
public static void PAll() {
//MG = getGraphics();
//MG.setColor(200,200,50);
//i++;
//if (i>10) {i=0;j++;}
//if (j>10) {i=0;j=0;}
//MG.fillRect(i,j,10,10);
//flushGraphics();
}
чтобы метод был общим для всех экземпляров класса, либо надо инициализировать экземпляр класса GC в классе class MainLoop extends TimerTask
|
(Offline)
|
|
13.07.2006, 23:35
|
#5
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
а можно так:
public class Main extends MIDlet implements CommandListener {
public static GameC GC = null;
и
public void run() {
Main.GC.PAll();
|
(Offline)
|
|
14.07.2006, 00:26
|
#6
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
респект братва!!! вы просто супер!
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
14.07.2006, 01:15
|
#7
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
аааагааа
так нечестно теперь в этом классе все переменные надо делать static и даже теперь flushGraphics(); низя вызвать поскольку она не объявлена статичной... косячОк...
теперь при вызове MG.setColor(200,200,50); опять все подвисает... эта ведь байда не статичная.
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
14.07.2006, 01:26
|
#8
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
короче по моему объявить всё статичным это не выход поскольку всё статичным не объявишь... звучит глупо но факт...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
14.07.2006, 10:24
|
#9
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
А как ты хотел. Чтобы вызвать метод другого класса надо или ссылку на него передавать или в статическую переменную записать чтобы всем было видно. Или делать методы статическими и передавать им экземпляр объекта, если их много одинаковых.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
проблема с TimerTask |
SubZer0 |
Программирование |
2 |
27.10.2006 10:31 |
Часовой пояс GMT +4, время: 20:28.
|