• [THÔNG BÁO] CẢNH BÁO LỪA ĐẢO MẠO DANH QUẢN TRỊ VIÊN
    Chào các thành viên GameVN,
    Dạo gần đây tình trạng lừa đảo scamming và phishing đang gia tăng. Ban quản trị GameVN xin lưu ý toàn bộ thành viên:
    KHÔNG/ ĐỪNG / CẤM cho bất kỳ ai tự xưng là quản trị viên của server vay tiền.
    Mọi hành vi lân la làm quen, tự tiện nhắn tin trên Discord, Facebook, Zalo hoặc các nền tảng mạng xã hội khác,
    núp bóng dưới danh nghĩa sinh hoạt của quản trị viên, đều có tỉ lệ rất, rất cao là lừa đảo.
    Nếu có tài khoản lạ add friend hoặc nhắn tin xin tiền dưới danh nghĩa admin:
    Block ngay
    Report ngay
    Không chuyển khoản, không cung cấp thông tin cá nhân


    Quản trị viên của forum và Discord server GameVN không có nhu cầu vay tiền thành viên.
    Không có lý do nào để admin chủ động kết bạn rồi xin tiền.
    Mọi thông báo chính thức chỉ được đăng trên kênh thông báo của server và topic chính thức trên forum.
    Tin nhắn riêng từ tài khoản lạ không phải thông báo của ban quản trị.
    Cảm ơn các bạn đã chú ý và cùng giữ cộng đồng an toàn.
    — Ban quản trị GameVN

    Tắt thông báo bằng nút X bên góc phải của bảng thông báo*

Xin các pác cho hỏi hàm về g.dispose()

laylayzi

Mario & Luigi
Tham gia ngày
22/11/08
Bài viết
741
Reaction score
59
số là hôm nay ông thầy có cho 1 đoạn code "trái banh chạy trên màn hình" bảo về nhà tự đọc tự tìm hiểu và ổng ko giải thích gì thêm
cái chính là xem và hiểu cách làm việc của multithread

đây là lần đầu em gặp code java, trước đây chưa từng học về cái này
nên săn tiện muốn tìm hiểu thêm tí

về đoạn code dưới đây em cũng hiểu đc sơ sơ
duy chỉ có cái hàm g.dispose() ko hiểu để làm gì

pác nào giải thích giúp em, em xin cám ơn & nếu đc thì giải thích nguyên đoạn code giùm em xem cái "sơ sơ" của em hiểu đc có chính xác ko

cám ơn máy pác nhiều :4cool_beauty:

Mã:
import java.awt.*;
import javax.swing.*;
public class Balls extends Thread{
    private JPanel box;
    private static final int XSIZE=10;
    private static final int YSIZE=10;
    private int x=0;
    private int y=0;
    private int dx=2;
    private int dy=2;
    public Balls(JPanel p){
        box=p;
    }
    public void draw(){
        Graphics g=box.getGraphics();
        g.fillOval(x,y,XSIZE,YSIZE);
        g.dispose();
    }
    public void move(){
        Graphics g=box.getGraphics();
        g.setXORMode(Color.GREEN);
        g.fillOval(x,y,XSIZE,YSIZE);
        x+=dx;
        y+=dy;
        Dimension d=box.getSize();
        if(x<0){
            x=0;
            dx=-dx;
        }
        if(x+XSIZE>=d.getWidth()){
            x=d.width-XSIZE;
            dx=-dx;
        }
        if(y<0){
            y=0;
            dy=-dy;
        }
        if(y+YSIZE>=d.getHeight()){
            y=d.height-YSIZE;
            dy=-dy;
        }
        g.fillOval(x,y,XSIZE,YSIZE);
        g.dispose();
    }
    public void run(){
        draw();
        for(int i=0; i<5000; i++){
            move();
            try{
                sleep(10);
            }catch(InterruptedException ex){
                JOptionPane.showMessageDialog(null,ex.toString(),"Thong Bao Loi",JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}
 
dispose để ngắt tiến trình đó bạn, cụ thể là ngắt tiến trình của đối tượng g !!!!!!
 
Nhầm rồi, bạn để ý là trong vòng lặp for(5000) phương thức move() được gọi 5000 lần, mỗi lần gọi biến tham chiếu g lại được khởi tạo Graphics g=box.getGraphics(), nếu cứ để nó tạo tự do quá nhiều biến thì sẽ dẫn đến tràn bộ nhớ, nếu chỉ trông cậy vào tiến trình dọn rác của Java không thì không đáng tin lắm, thông thường một lập trình viên có kinh nghiệm sẽ giải phóng bộ nhớ thủ công luôn mà không đợi đến lúc trình dọn rác làm việc, phương thức dispose() ở đây chính là để giải phóng bộ nhớ cho biến g.

Với máy móc như hiện nay thì dù bạn có bỏ dòng code đó đi thì chạy cũng chẳng thấy có khác biệt gì, nhưng cứ thử bỏ dispose(), bỏ sleep(), tăng vòng lặp lên 1 tỉ xem sao, mình ko thử nhưng đoán là sẽ treo :))
 
Back
Top