2017-02-17 53 views
0

我有一个计时器,应该说我的应用程序,它的时间来阅读一些数据TimerTask的并发问题

new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      try { 
        states[PICK_FRAME_STATE]=true; 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }, 1000/fRate); 

状态阵列的final boolean[]

凡平局循环中的数据的读取

if(lastFrame!=null&&states[PICK_FRAME_STATE]){ 
     father.image(lastFrame, 500, 200,VRes,HRes); 
     buff.add(lastFrame); 
     //states[PICK_FRAME_STATE]=false; 
     System.out.println(is++); 
    } 

但是指令

states[PICK_FRAME_STATE]=false;

如果没有评论使得应用程序崩溃。

我希望能够检测什么时候在至少1000/fRate毫秒通过一个循环,它通常比1000/fRate更快。

我认为TimerTask每次至少授予一次执行时间间隔,但是我遇到并发问题(不出所料),此解决方案,任何解决方法?

java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at aaa.view.video.CameraWindow.draw(CameraWindow.java:78) 
    at aaa.view.video.CameraWindow.render(CameraWindow.java:99) 
    at aaa.desktop.view.ProfileView.render(ProfileView.java:55) 
    at aaa.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

(由Tobias编辑从答案)

long time=System.currentTimeMillis(); 
public void draw() { 
    if (video.available()) { 
    video.read(); // Read a new video frame 
    lastFrame=video; 
    } 
    if(lastFrame!=null && System.currentTimeMillis() - time >= 1000){ 
     time = System.currentTimeMillis(); 
     father.image(lastFrame, 500, 200,VRes,HRes); 
     buff.add(lastFrame); 
     System.out.println(is++); 
    } 
} 

作品甚至强硬它给3例外,像以前一样,但它所有的罚款。奇怪的是,如果我评论的线

time = System.currentTimeMillis(); 

我没有得到任何例外

0 <=first frame added 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
java.lang.NullPointerException 
    at processing.opengl.Texture.copyBufferFromSource(Texture.java:859) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at processing.video.Capture.read(Unknown Source) 
    at ygg.view.video.CameraWindow.draw(CameraWindow.java:81) 
    at ygg.view.video.CameraWindow.render(CameraWindow.java:101) 
    at ygg.desktop.view.ProfileView.render(ProfileView.java:55) 
    at ygg.desktop.view.MainView.draw(MainView.java:385) 
    at processing.core.PApplet.handleDraw(PApplet.java:2386) 
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862) 
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665) 
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649) 
    at javax.media.opengl.awt.GLCanvas$10.run(GLCanvas.java:1289) 
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119) 
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994) 
    at javax.media.opengl.awt.GLCanvas$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:301) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
1 
2 
3 

ECC ......每1000毫秒

+0

请显示崩溃的堆栈跟踪。 – Divers

+0

你为什么认为这与并发有关? 'Texture.java:859'会发生什么? –

+0

at aaa.view.video.CameraWindow.draw(CameraWindow.java:78)其中应用程序试图读取相机输入(在报告的代码之前),这似乎与问题无关,但如果我评论并发写入所有作品,否则我会在每个循环中都得到报告的异常。 aaa.view.video.CameraWindow.draw(CameraWindow.java:78)之上的行正在处理库 – Yggdrasil

回答

1

试试这个

private long time = System.currentTimeMillis(); 

//... 

// draw call: 
if(lastFrame != null && System.currentTimeMillis() - time >= 1000){ 
    // do stuff 
    time = System.currentTimeMillis(); 
} 

// do stuff以最高每叫1000毫秒。没有任何TimerTask魔法。

编辑

试试这个捕捉“遗漏”帧:

private long time = System.currentTimeMillis(); 

//... 

// draw call: 
long delta = System.currentTimeMillis() - time; 
if(lastFrame != null && delta >= 1000){ 
    int framesMissed = delta/1000; // rounds to full seconds 
    for(int i=0;i<framesMissed;i++){ 
     // do stuff for each missed frame/picture 
    } 
    // apply "overlap" so we actually carry the right result to the next call 
    time = System.currentTimeMillis() - (delta-(1000*framesMissed)); 
} 

// do stuff现在将要求已通过每一秒,不顾绘制调用的频率(它们可以更快或慢于1000ms)

+0

工作正常谢谢,我添加了编辑问题。 TimerTask的优点(我认为),例如如果时间是2000+(因为相机线程缓慢),那么接下来的2个循环应该记录2帧,赋予时间/帧一致性(与我的不一样执行艰难的xd) – Yggdrasil

+0

好的谢谢,我投了答案,但他们不让我upvote你,因为低代表(新用户) – Yggdrasil