2014-12-10 6 views
2

SWT 기반 응용 프로그램의 경우 SWT가 "더 이상 처리하지 않음"오류로 인해 충돌하는 특정 SWT 충돌 보고서가 있습니다. 이는 극소수의 사람들에게만, 때로는 애플리케이션을 시작하는 초기 단계에 발생합니다. 아주 초기 응용 프로그램 상태의 전형적인 스택 트레이스는 다음과 같습니다"더 이상 처리하지 마십시오"이유

Caused by: org.eclipse.swt.SWTError: No more handles 
    at org.eclipse.swt.SWT.error(SWT.java:4467) 
    at org.eclipse.swt.SWT.error(SWT.java:4356) 
    at org.eclipse.swt.SWT.error(SWT.java:4327) 
    at org.eclipse.swt.widgets.Widget.error(Widget.java:476) 
    at org.eclipse.swt.widgets.TaskBar.createHandle(TaskBar.java:103) 
    at org.eclipse.swt.widgets.TaskBar.<init>(TaskBar.java:96) 
    at org.eclipse.swt.widgets.Display.getSystemTaskBar(Display.java:2567) 
    ... 

우리는 이미 우리의 응용 프로그램을 테스트 한 정상적인 조건에서이 모든 자원을 누설하지 않습니다 (글꼴, 색상, 이미지, GC를, ...), Windows 작업 관리자 (핸들, 사용자 개체, GDI 개체, ...)의 값은 상위 3 분의 1에 불과하지만 종종 최상위 값이 아닙니다.

이러한 문제를 일으킬 수있는 이유는 응용 프로그램이 많은 컴퓨터 일 수 있으며 디버깅 된 다른 응용 프로그램은 대규모 리소스를 유출 할 수 있습니까? 어떤 정보 (예 : "tasklist.exe"의 출력 가능한 이유에 대한 단서를 얻기 위해 사용자에게 요청해야합니까?

+0

http://stackoverflow.com/questions/2018553/swt-no-morehandles 유용한 정보를 찾을 수 있습니다. – manouti

+1

Windows에는 프로세스 및 세션 당 최대 개수의 GDI 개체가 있으며, 다른 프로세스에서 많은 GDI 개체를 사용하고있을 수 있습니다. – rafalopez79

+1

SWT 'no more handles'메시지는 다양한 조건에서 포괄적 인 메시지입니다. 이 특별한 경우에 Windows API 인 'CoCreateInstance'가 오류 –

답변

1

방금 ​​같은 오류 보고서가 있습니다. 깊이를 조사하기 위해, 다음과 같은 코드를 사용할 수 있습니다

// 
// MessageId: E_OUTOFMEMORY 
// 
// MessageText: 
// 
// Ran out of memory 
// 
#define E_OUTOFMEMORY     _HRESULT_TYPEDEF_(0x8007000EL) 

난 아직도하지 : 내 경우

import org.eclipse.swt.internal.win32.OS; 
import org.eclipse.swt.widgets.Display; 

public class InvestigateSwtProblem { 

    static final byte[] CLSID_TaskbarList = new byte[16]; 
    static final byte[] IID_ITaskbarList3 = new byte[16]; 

    static { 
     OS.IIDFromString("{56FDF344-FD6D-11d0-958A-006097C9A090}\0".toCharArray(), CLSID_TaskbarList); //$NON-NLS-1$ 
     OS.IIDFromString("{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}\0".toCharArray(), IID_ITaskbarList3); //$NON-NLS-1$ 
    } 

    public static void main(String[] args) { 
     Display display = new Display(); 

     int /*long*/[] ppv = new int /*long*/ [1]; 
     int hr = OS.CoCreateInstance(CLSID_TaskbarList, 0, OS.CLSCTX_INPROC_SERVER, IID_ITaskbarList3, ppv); 
     System.out.println("Result of CoCreateInstance = " + hr); 
    } 
} 

오류가 나는 것으로 WINERROR.H에서 발견 -2147024882이었다 이유 또는 해결책을 알지만 적어도 sysadmin에게 알려줄 것이 있습니다.

추신. 이것은 32 비트 SWT 인 경우입니다. 64 비트 SWT에서 테스트하지는 않았지만, int로 대체해야한다고 생각합니다. int/* long */이 코드에 나타납니다.