2017-02-17 8 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) 

(редактирование от ответа Тобиасом)

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 

ЕСС ... каждый 1000 мс

+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 называется максимум каждый 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 теперь будет называться для каждого второго, что прошло, не обращая внимания на частоту вызовов отрисовки (они могут быть быстрее или медленнее, чем 1000 мс)

+0

работает отлично спасибо, я добавил редактирование вопроса. У TimerTask есть преимущество (я думаю), например, если время должно быть 2000+ (из-за медленного в потоке камеры), то следующий 2 цикла должен записывать 2 кадра, обеспечивая согласованность времени/кадров (ну, не с моим реализация жесткая xd) – Yggdrasil

+0

отлично спасибо, я проголосовал за ответ, но они не позволяют мне продвигать вас, потому что низкий представитель (новый пользователь) – Yggdrasil