2015-01-09 47 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