2015-01-09 41 views
1

簡要說明: 在多線程循環中,整數在內部循環中不增加,而在外部循環中不增加。整數不在內部循環中遞增

我的代碼:

public void run() { 
     if(maxH==actualmaxH) 
      actualmaxH--; 
     if(maxW==actualmaxW) 
      actualmaxW--; 
     for(;i<=actualmaxW; i++) { 
      for (; j <=actualmaxH; j++) { 
       Hit hit=world.hit(cam.rayFor(maxW,maxH,i,j)); 
       Color col; 

       if(hit==null) 
        col = world.backgroundColor; 
       else 
        col = hit.geo.material.colorFor(hit, world, 0); 

       int rgb = ((int)(col.r*255)<< 16) | ((int)(col.g*255)<< 8) | ((int)(col.b*255)); 
       raster.setDataElements(i, maxH - j - 1, model.getDataElements(rgb, null)); 
      } 

      if(i%30==0) { 
       frame.update(g); 
      } 
     } 
     frame.update(g); 
    } 

這段代碼是從構造通過「新主題(本)」(此實現Runnable)和構造是由具有不同的I,J另一個類稱爲打來電話,實際上.. 其餘的基本上保持不變

同樣,問題是,在外部循環中,我得到增加就好了,而在內部循環其始終爲0(或當然其他起始數字在其他線程)

我希望我很清楚。 如果有什麼不清楚的地方,我會很高興地回答我的代碼問題,並希望任何人都能找到解決方案。 還是要謝謝你=)

編輯: 從那裏它被稱爲:

Thread t1=new Thread(0,0, img.getWidth()/2, img.getHeight()/2, img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g); 
      Thread t2=new Thread(img.getWidth()/2+1, 0, img.getWidth(), img.getHeight()/2, img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g); 
      Thread t3=new Thread(0, img.getHeight()/2+1, img.getWidth()/2, img.getHeight(), img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g); 
      Thread t4=new Thread(img.getWidth()/2+1, img.getHeight()/2+1, img.getWidth(), img.getHeight(), img.getWidth(), img.getHeight(), world, cam , raster, model, frame, g); 

而且構造匹配:

java.lang.Thread t; 
    int i; 
    int j; 
    int maxW; 
    int maxH; 
    int actualmaxW; 
    int actualmaxH; 
    World world; 
    Camera cam; 
    WritableRaster raster; 
    ColorModel model; 
    JFrame frame; 
    Graphics g; 

    public Thread(int i, int j, int actualmaxW, int actualmaxH, int maxW, int maxH, World world, Camera cam, WritableRaster raster, ColorModel model, JFrame frame, Graphics g){ 
     this.i=i; 
     this.j=j; 
     this.actualmaxW=actualmaxW; 
     this.actualmaxH=actualmaxH; 
     this.maxW=maxW; 
     this.maxH=maxH; 
     this.world=world; 
     this.cam=cam; 
     this.raster=raster; 
     this.model=model; 
     this.frame=frame; 
     this.g=g; 
     t=new java.lang.Thread(this); 
     t.start(); 
    } 
+0

所以爲了正確理解你:在Hit hit = world.hit(cam.rayFor(maxW,maxH,i,j))行;''i'即使在外層的第一次迭代之後仍保持其初始值循環(其中'我'增加到'初始+1')? – Tom 2015-01-09 21:10:12

+0

您的變量(maxH,actualmaxH,maxW,...)是否在此線程之外使用?你可以在單個線程中重現問題嗎?多線程編程在某些方面很棘手,因此最好區分簡單問題和多線程問題。 – v6ak 2015-01-09 21:13:24

+0

@Tom感謝編輯提示=) 和是在行「Hit hit = world.hit(cam.rayFor(maxW,maxH,i,j));」即使經過第一次迭代外循環後,我始終爲0 ........... 當我創建只有一個線程問題仍然存在=) ......... 只有maxH和maxW用於線程之外 – Dasterr 2015-01-09 21:20:35

回答

1

這似乎是這個問題:

for(;i<=actualmaxW; i++) { 
    for (; j <=actualmaxH; j++) { 

如果j變得大於會發生什麼在外循環的第一次迭代中?內循環將退出。所以,現在第二個迭代的外環,其中i現在增加了1。但由於j仍然大於actualmaxH,因此內部循環將不再被「使用」。

一種可能方案可以是這樣的:

for (; i <= actualmaxW; i++) { 
    for (int temp = j; temp <= actualmaxH; temp++) { 

,然後在內部循環使用temp代替j

+0

正是這個問題=) 感謝您的幫助 ....... 現在可以關閉 – Dasterr 2015-01-09 21:52:46

+0

@Dasterr問題得到[關閉](http://stackoverflow.com/help/closed-問題),如果他們是重複的e另一個問題或一個「壞」問題(因爲它不知道提問者意味着什麼,或者它是寬泛的還是......)。所以我想你不會問你的問題:P。但有一個他們表明,一個問題解決了。它被稱爲[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。如果你喜歡,你可以接受這個答案,但我不會推動你這樣做:)。 – Tom 2015-01-09 21:57:49