forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   TimerTask (http://forum.boolean.name/showthread.php?t=1141)

SubZer0 13.07.2006 02:55

TimerTask
 
Короче или это ошибка или хз

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

в чем ошибка?

:)

Piligrim 13.07.2006 14:05

Все вызывается и работает. Просто надо помнить что это другой процесс. Нельзя вызывать одни и те же методы одновременно из разных процессов, если это требуется пиши public synchronized void metodName()
И еще задача должна успеть выполниться до следующего ее вызова по таймеру иначе действительно приложение вылетит в трубу.

SubZer0 13.07.2006 14:24

хммм... не работает...

код: 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 раз говорил Маркс с Энгельсом пролетают по полной по напрягу умственной деятельности... они на яве никогда не кодили, ламо блин ушастые...

:)

pax 13.07.2006 21:33

Надо либо делать метод статичным:
Код:

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

Piligrim 13.07.2006 23:35

а можно так:

public class Main extends MIDlet implements CommandListener {
public static GameC GC = null;

и
public void run() {
Main.GC.PAll();

SubZer0 14.07.2006 00:26

респект братва!!! вы просто супер! :)

SubZer0 14.07.2006 01:15

аааагааа :unsure:

так нечестно теперь в этом классе все переменные надо делать static и даже теперь flushGraphics(); низя вызвать поскольку она не объявлена статичной... косячОк... :''((

теперь при вызове MG.setColor(200,200,50); опять все подвисает... эта ведь байда не статичная.

SubZer0 14.07.2006 01:26

короче по моему объявить всё статичным это не выход поскольку всё статичным не объявишь... звучит глупо но факт... :''((

Piligrim 14.07.2006 10:24

А как ты хотел. Чтобы вызвать метод другого класса надо или ссылку на него передавать или в статическую переменную записать чтобы всем было видно. Или делать методы статическими и передавать им экземпляр объекта, если их много одинаковых.


Часовой пояс GMT +4, время: 22:26.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot