2011-07-11 33 views
5

tất cả. Một chủ đề trong một chương trình Java Tôi đang làm việc trên hoạt hình một bước đi ngẫu nhiên trong không gian (hoặc ít nhất, nó sẽ một khi vấn đề này được giải quyết). Nó chứa hai phương pháp sau:Sự cố liên quan đến sự tồn tại biến giữa các chuỗi trong java

public void run() { 
    while(gw.checkBoundingBox()) { 
     if(!gw.pause) step(); 
    }  
} 

public void step() { 

    Point3d p1, p2; 

    //get the last point, step, get the new point 
    p1 = new Point3d(gw.position); 
    gw.randomStep(); 
    p2 = new Point3d(gw.position); 

    //create the Alpha that will do the animation, and wrap it in an AlphaControl, 
    //which will set this object's pause flag until the Alpha finishes 
    Alpha alpha = new Alpha(); 
    alpha.setLoopCount(1); 

    if(alpha.finished()) System.out.println("DEBUG: I'm already dead."); 

    AlphaControl ac = new AlphaControl(alpha,gw); 
    ac.start(); 

    //create a piece of the path, attach an interpolator to do the animation 
    PathCyl cyl = new PathCyl(p1,p2); 

    StretchInterpolator si = new StretchInterpolator(alpha, cyl.anchor); 
    si.setSchedulingBounds(new BoundingSphere(new Point3d(0,0,0),50)); 
    cyl.anchor.addChild(si); 

    //put it all together 
    BranchGroup b = new BranchGroup(); 
    b.addChild(cyl.tg); 
    trans.addChild(b); 
} 

Vì vậy, nếu cờ tạm dừng không được đặt, nó sẽ chạy bước(). Phần duy nhất của bước() mà bạn cần xem xét là một vài dòng về đối tượng Alpha. (Alpha là một lớp API tạo ra một hàm phụ thuộc vào thời gian được sử dụng cho hoạt ảnh). Vì vậy, bước() tạo ra một đối tượng Alpha, sau đó nó ăn đến một chủ đề khác gọi là AlphaControl. AlphaControl cho chương trình ngừng tính điểm cho đến khi bước này được thực hiện hoạt ảnh. Nó thực hiện điều này bằng cách thiết lập cờ tạm dừng được kiểm tra trong phương thức run().

Vậy vấn đề là gì? Lưu ý rằng tôi đã thêm một dòng gỡ lỗi để kiểm tra ngay lập tức nếu Alpha được hoàn thành sau khi nó được tạo ra. Có vẻ như dòng mã này không bao giờ được thực thi. Alpha có kết thúc không? Tất nhiên là không, chúng tôi vừa tạo ra nó. Nhưng dòng này thực hiện mỗi lần hàm được gọi là SAU lần đầu tiên. Bằng cách nào đó nó đang treo trên cùng một thể hiện Alpha và sử dụng nó hơn và hơn. Tôi cho rằng điều này là do tham chiếu đến Alpha vẫn còn sống trong chủ đề AlphaControl.

Vậy làm cách nào để khắc phục sự cố này? Tôi đã thử nhiều thứ. Tôi đã tạo ra một mảng khổng lồ của Alphas, khởi tạo tất cả chúng trước khi đi bộ thậm chí bắt đầu, và cố gắng nói với nó để sử dụng một alpha khác nhau từ mảng ở mọi bước, nhưng điều này có cùng một kết quả. Tôi cũng đã thử sử dụng AlphaControl để đặt alpha thành null trước khi nó đóng, nhưng điều này cũng không hoạt động. Có thể phá hủy vật thể này không? Khi mã bước() được chạy trở lại, AlphaControl được tạo lần đầu tiên nên được thực hiện và chờ đợi để thu thập rác.

Ngoài ra, chỉ trong trường hợp sẽ hữu ích nếu thấy nó, đây là lớp AlphaControl.

public class AlphaControl extends Thread { 

public Alpha alpha; 
public GraphicalWalker gw; 

public AlphaControl(GraphicalWalker gw, Alpha alpha) { 
    this.gw = gw; 
    this.alpha = alpha; 
} 

public void run() { 

    boolean stop = false; 
    boolean finished; 

    while(!stop) { 
     finished = alpha.finished(); 

     if(!finished && !gw.pause) gw.pause = true; 
     if(finished && gw.pause) gw.pause = false; 
     if(finished) stop = true; 
    } 
} 

} 

Cảm ơn bạn đã giúp đỡ. Jeff

+3

Bạn không hiển thị mã cho 'Alpha': Bạn có chắc chắn rằng' alpha.finished() 'trả về' false' trực tiếp sau khi xây dựng 'alpha'? Và 'alpha.setLoopCount (1);' cũng không đặt nó thành 'false'? – Howard

+1

cũng có thể giúp xem nguồn cho Alpha. – nojo

+0

Bạn đã cố gắng gỡ lỗi mã của mình chưa? nếu không thì hãy làm một lần. –

Trả lời

0

Tôi không chắc chắn liệu tôi có hoàn toàn theo đuổi mục đích của chương trình hay không, nhưng có vẻ như bạn có điều kiện chạy đua. Khi bạn gọi ac.start() trên đối tượng AlphaControl của mình, có không đảm bảo rằng gw.pause sẽ được đặt trước vòng lặp tiếp theo của việc thực hiện vòng lặp của bạn. Trong thực tế, có một cơ hội công bằng mà vòng lặp sẽ thực hiện nhiều lần trước khi gw.pause nhận được thiết lập.

Chỉ cần cho đá, tôi đề nghị gọi ac.run() thay vì ac.start() khi chạy qua, như một phím tắt để lấy luồng ra khỏi hình ảnh. Nếu các hành vi dự định xảy ra, sau đó tôi sẽ xem xét cứng tại lý do của bạn để làm điều này trong nhiều chủ đề thay vì một duy nhất.

0

Tôi nghĩ vấn đề là một trong hai vấn đề:

bang
  • Alpha 's được giữ như là một biến tĩnh, có nghĩa rằng đó là cùng cho tất cả các trường hợp của Alpha, và bạn đang có khả năng không đặt lại nó trong constructor (đúng như vậy).
  • Một số phần của tiểu bang của bạn không được đánh dấu volatile, mà phá vỡ ngữ nghĩa trình biên dịch dựa vào để biết rằng một đánh dấu lĩnh vực sẽ luôn yêu cầu một tra cứu giá trị tươi (nếu không trình biên dịch là miễn phí để bộ nhớ cache giá trị)
2

Tôi nghĩ chìa khóa để hiểu tại sao mã của bạn không hiểu được lớp Alpha của thư viện Java3D làm gì. Từ câu hỏi của bạn có vẻ như với tôi bạn không hiểu nó một cách chính xác. Nó không lặp lại. Nếu bạn kiểm tra mã nguồn (http://www.java2s.com/Open-Source/Java/6.0-JDK-Modules/java-3d/javax/media/j3d/Alpha.java.htm), bạn sẽ thấy nó không chứa một cấu trúc vòng lặp đơn lẻ. Nó làm gì, là định nghĩa một hàm ánh xạ giá trị thời gian tới một giá trị trong phạm vi [0,1].

Nếu bạn nhìn vào nguồn gốc của phương pháp hoàn chỉnh():

/** 
    * Query to test if this alpha object is past its activity window, 
    * that is, if it has finished looping. 
    * @return true if no longer looping, false otherwise 
    */ 
    public boolean finished() { 
     long currentTime = paused ? pauseTime : J3dClock.currentTimeMillis(); 
     return ((loopCount != -1) && 
      ((float)(currentTime - startTime) * .001f > stopTime)); 
    } 

bạn nhận thấy rằng giá trị của nó phụ thuộc vào khi nó được gọi.

Và vì bạn đã xác định cơ bản alpha của mình để có 1 vòng lặp 1 mili giây, bắt đầu từ thời điểm tạo, nó sẽ không được hoàn thành trong 1 mili giây sau khi bạn tạo alpha đó và kết thúc sau đó.

Tôi hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan