2017-02-17 7 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++); 
    } 

그러나 명령

01,232,;

댓글이 없으면 응용 프로그램이 다운됩니다.

적어도 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) 

(토비아스 의해 답변에서 편집)

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 MS에게 의견을 이상하게 경우

+0

충돌의 스택 추적을 표시하십시오. – Divers

+0

왜 이것이 동시성과 관련이 있다고 생각합니까? 'Texture.java : 859'에서 어떻게됩니까? –

+0

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 시도 1000ms. 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