2010-01-26 3 views
2

일부 운영 체제에서는 응용 프로그램이 처리 할 수있는 것보다 빠르게 keyPressed 이벤트를 생성합니다. 내 첫번째 생각은 통화가 서로 너무 가까운 경우이 같은으로 작업을 수행 할 것이었다 : 자바 스윙 애플리케이션에 빠른 키 속도가 적용되면 어떻게 파이프 라인에서 이벤트를 일찍 삭제할 수 있습니까?

public void actionPerformed(ActionEvent e) { 
    long now = System.currentTimeMillis(); 
    if(now - lastCall < 150) { 
     System.out.println("dropping event"); 
    } 
    else { 
     lastCall = now; 
    } 
} 

불행하게도 이벤트 낙하에도 불구하고, 응용 프로그램이 여전히 잠그고 큐에서 이벤트의 톤을 구축합니다. 낮은 수준에서 이벤트를 삭제할 수있는 방법이 있습니까? 나는 그들이 위의 저의 청취자에게 다가 갈 때까지 응용 프로그램을 잠그지 않고 저장하는 것은 너무 늦었다 고 생각합니다. 도움 주셔서 감사합니다.

편집 : 또한 리스너가 메뉴 항목과 연결된 AbstractAction의 일부임을 언급해야합니다.

+1

응용 프로그램이 keyPressed 이벤트를 처리 할 수없는 이유가 있습니까? 이벤트 처리기에서 장기 실행중인 작업을 수행하고 있습니까? 이벤트 처리 코드가 어떤 모양인지 알 수 있다면 도움이 될 것입니다. – justkt

+0

브라이언 Agnew에게 내 코멘트를 참조하십시오. 전체 "작업"을 단일 인쇄 줄로 바꾼다고해도 여전히 문제가 발생합니다. 이벤트는 대기열에 쌓여서 처리기에 도착하는 데 시간이 걸리는 것처럼 보입니다. 그들이 도착할 때까지 이미 잠금이 발생하고 빠른 동작 코드를 사용하거나 이벤트를 삭제/통합하는 것이 중요하지 않습니다! –

+0

최소한의 예제에서 잠금 동작을 재현 할 수 있습니까? 이 동작을 나타내는 운영 체제는 무엇입니까? –

답변

2

이 실제로 도움이되는지 잘 모르겠지만, 어쩌면 당신은 이런 식으로 그것을 수행해야합니다

public void actionPerformed(ActionEvent e) { 
    e.consume(); 
    long now = System.currentTimeMillis(); 
    if(now - lastCall < 150) { 
     System.out.println("dropping event"); 
    } 
    else { 
     lastCall = now; 
    } 
} 

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/InputEvent.html#consume()

+0

나는 그 아이디어가 마음에 들지만 소비()는 보호 받고있다! –

+0

Consume()은 KeyEvents에 대해 public이므로 AbstractAction 대신 KeyListener를 사용할 수도 있습니다. 그러나 액션이 메뉴 항목과 잘 연관되어 있기 때문에 피하기를 원합니다.하지만 애비뉴입니다. 다시 한번 감사드립니다. –

2

앱이 키 누름에 제 시간에 응답 할 수없는 경우, 내가 걸릴 것 시간이 많이 걸리는 섹션을 대역 외 처리하고 별도의 스레드에서 처리합니다.

그런 다음 필요에 따라 키 누르기 및 bin duplicate 등의 대기열을 만들거나 다른 지능형 필터링을 수행 할 수 있습니다. 이것은 모두 응용 프로그램마다 다르지만 핵심은 GUI 이벤트 처리에서 강력한 처리를하는 것입니다.

+0

의견을 보내 주셔서 감사합니다. actionPerformed에서 실행되는 코드는 실제로 집중적이지 않습니다. 사실 하나의 인쇄 라인으로 모든 것을 대체하더라도 여전히 발생합니다. 위의 코드에서 병합 시간을 1000 밀리 초로 지정해도 프로그램이 계속 중단됩니다. 다른 한편으로, 가능한 한 빨리 (예를 들어 10 회) 10 초 동안 키를 친다면, 정상적으로 작동합니다.이벤트가 너무 오래 걸려서 파이프가 이미 막히고 위 코드 에서처럼 이벤트를 삭제하면 도움이되지 않습니다. : - \ –

관련 문제