ورود

View Full Version : چرا برنامه ام بعد از گذشت چند ثانیه هنگ می کند ؟



مهران رسا
چهارشنبه 25 اسفند 1389, 19:38 عصر
سلام . این کد برنامه هست :


import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class CanvasUnit extends Canvas {

private Timer timer;
private TimerTaskClass task;
private int Top=13 , Left=48;
private int width = getWidth();
private int height = getHeight();
private static int SWidth = 10;
private static int SHeight = 10;
private int LStep = 5;
private int TStep = 5;

public CanvasUnit() {
timer = new Timer();
task = new TimerTaskClass();
timer.schedule(task,10);
}

public void paint(Graphics g) {

g.setColor(0,0,0);
g.fillRect(0, 0, width, height);
g.setColor(255,255,255);

g.drawRect(Left, Top, SWidth, SHeight);
}
private class TimerTaskClass extends TimerTask{

public final void run(){

if (Left > (width - SWidth)) {
LStep = LStep * (-1);
} else if (Left < 0) {
LStep = Math.abs(LStep);
}
//
if (Top > (height - SHeight)) {
TStep = TStep * (-1);
} else if (Top < 0) {
TStep = Math.abs(TStep);
}

Left = Left + LStep;
Top = Top + TStep;

repaint();

//Run the timer agian
timer = new Timer();
task = new TimerTaskClass();
timer.schedule(task,10);
}

}
}


مشکل کار کجاست ؟

dr_jacky_2005
پنج شنبه 26 اسفند 1389, 09:13 صبح
هدف در مجموع چیست؟!
میخواین چیکار کنید؟

مهران رسا
پنج شنبه 26 اسفند 1389, 10:25 صبح
هدف در مجموع چیست؟!
میخواین چیکار کنید؟
یک نوع انیمیشن که در اون یک مربع به دیواره های عمودی و افقی صفحه اصابت میکنه و مداوم در حال بلوکه شدن هست . ضمناً نمیدونم استفاده از تایمر به این صورت صحیح است یا خیر . چون میخوام عملیات تایمر ادامه دار باشه مجبور شدم از داخل تایمر مجدداً یک تایمر دیگه ایجاد کنم. راه درست چیه ؟ یعنی ایجاد فقط یک تایمر و فراخوانی رویداد Tick به تعداد دفعات نا مشخص .

مهران رسا
پنج شنبه 26 اسفند 1389, 19:27 عصر
راه حل : استفاده از یک Thread جداگانه و متد Sleep

import javax.microedition.lcdui.*;

public class CanvasUnit extends Canvas {

private int Top = 13, Left = 48;
private int width = getWidth();
private int height = getHeight();
private static int SWidth = 10;
private static int SHeight = 10;
private int LStep = 5;
private int TStep = 5;

public CanvasUnit() {
Thread t = new Thread(new Runnable() {

public void run() {
while (true) {

if (Left > (width - SWidth)) {
LStep = LStep * (-1);
} else if (Left < 0) {
LStep = Math.abs(LStep);
}
//
if (Top > (height - SHeight)) {
TStep = TStep * (-1);
} else if (Top < 0) {
TStep = Math.abs(TStep);
}

Left = Left + LStep;
Top = Top + TStep;

repaint();

try {
Thread.sleep(10);

} catch (Exception ex) {
}
}
}
});
t.start();
}

public void paint(Graphics g) {

g.setColor(0, 0, 0);
g.fillRect(0, 0, width, height);
g.setColor(255, 255, 255);

g.drawRect(Left, Top, SWidth, SHeight);
}

}