2013-03-29 1 views
0

네트워크에서 로그 데이터를 고속으로 수신하는 SWT를 사용하는 데스크톱 앱을 작성하고 있습니다 (초당 100 패킷). 각 패킷에는 StyledText에 추가해야하는 행이 있습니다. 나는 비 UI 스레드에서 패킷을 수신하기 때문에,이 코드를 사용해야합니다 :다른 스레드의 StyledText.append()를 고속으로 사용하십시오.

display.asyncExec(new Runnable() { 

     @Override 
     public void run() { 
      txtLog.append(log); 
      txtLog.setTopIndex(txtLog.getLineCount() - 1); 
     } 
    }); 

을하지만이 코드는 내 로거가 너무 느리게 만들고, 내 로거의 출력은 보낸 사람과 동기화되지 않습니다. 예를 들어, 3 분 후에 송신 장치를 멈추고 프로그램 로그 출력이 멈 춥니 다. 그러나 이클립스 콘솔 출력 (System.out.println())은 보낸 사람과 완전히 동기화되고 출력을 정시에 종료합니다! 어떻게 일식 setText()StyledText?

답변

2

두 가지 :

사용 asyncExec보다는 syncExec -이 자체적으로 빠르게 로거를 만들 것입니다. 그러나 로거 항목이 UI 스레드가 처리 할 수있는 것보다 더 빨리 추가되면 이벤트 대기열이 점점 더 커지고 ... 약한 반응을 보일 것입니다 ...

모든 변경 사항은 다음과 같습니다. StyledText - 추가하는 것을 포함하여 - 다소 비쌉니다. 따라서 당신은 또한 당신의 로거의 중간 버퍼와 StyledText 위젯 할 수 있습니다 : 버퍼 가 비어 인 경우

  • 로거는 버퍼
  • 에 추가를, 다음 asyncExec
  • asyncExecRunnable 의지 할 현재 버퍼 내용을 추가하고 버퍼를 비우십시오.

이것은 내 응용 프로그램 중 하나에서 매우 잘 작동합니다 ...

+0

답장을 보내 주셔서 감사합니다. 오늘 로그인 할 때까지 나는이 게시물에 실망했다. 'asyncExec()'에 대해 당신이 옳다. 실제로 나는이 메소드를'syncExec()'대신에 코드에서 사용했다. 여기에 입력하는 것이 잘못되었습니다. 이 질문에 답하기 전에 필자는 앱에서 버퍼링을 사용했고 로그 텍스트는 보낸 사람 (50fps)과 동기화되지만 작업 관리자는 내 앱에 대해 영구적으로 16 % CPU 사용량을 표시합니다. 어떻게 해결할 수 있을까요?! – MHM

+0

"로그 텍스트가 보낸 사람 (50fps)과 동기화되었습니다."?? –

+0

버퍼링을 한 후 스케줄러를 사용하여 20 밀리 초 (50fps)마다 asyncExec()를 실행하고 버퍼를 위젯에 추가합니다. 하지만 재사용은 거대한 CPU 사용량입니다! – MHM