SWTError: No more handles

Koringar

Bekanntes Mitglied
Hi,

ich habe eine RCP Anwendung geschrieben, die als Überwachungstool dient. Diese läuft schon sehr lange im Einsatz und auch recht gut. Nur habe ich das Problem von Anfang an schon, das die Anwendung bei mir selber über mehrere Wochen hin weg ohne Probleme läuft, jedoch bei dem Anwender sich irgend wann einfach aufhängt.

Dies passiert von Anwender zu Anwender unterschiedlich, bei denn einem nach einem Tag und bei einem anderen erst nach einer Woche.

Die Exception die ausgeworfen wird ist:
Code:
!ENTRY org.eclipse.ui 4 0 2010-03-22 09:47:39.178
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.swt.SWTError: No more handles
	at org.eclipse.swt.SWT.error(SWT.java:3803)
	at org.eclipse.swt.SWT.error(SWT.java:3695)
	at org.eclipse.swt.SWT.error(SWT.java:3666)
	at org.eclipse.swt.graphics.Region.<init>(Region.java:78)
	at org.eclipse.swt.graphics.Region.<init>(Region.java:53)
	at org.eclipse.swt.custom.CTabFolder.drawBackground(CTabFolder.java:657)
	at org.eclipse.swt.custom.CTabFolder.drawBackground(CTabFolder.java:654)
	at org.eclipse.swt.custom.CTabFolder.drawTabArea(CTabFolder.java:1105)
	at org.eclipse.swt.custom.CTabFolder.onPaint(CTabFolder.java:2280)
	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:325)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1027)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1012)
	at org.eclipse.swt.widgets.Composite.WM_PAINT(Composite.java:1424)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:3842)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4541)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2371)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3420)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2384)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2348)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at de.elena.zss.gui.Application.start(Application.java:84)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1236)

Der Fehler sagt einfahc nur aus, der mir das OS nicht mehr GUI Elemente zulässt. Kann ich mir das von der Anwendung irgend wie ausgeben lassen, wieviel Elemente zu diesem Zeitpunkt vielleicht schon belegt sind?

Ich habe bis jetzt nur das Tool gefunden und da müsste ich bei dem Anwender am Rechner sitzen und das Überwachen, was ich nicht unbedingt will.

Bin gerne für Tips offen. Ach das OS ist bei allen Anwender WinXP.

MFG Koringar
 

Wildcard

Top Contributor
Du hast irgendwo ein Leak, erzeugst also SWT Resourcen ohne zu disposen.
Die üblichen Verdächtigen dafür sind Images, Colors, Fonts
 

Koringar

Bekanntes Mitglied
Jop,
habe ich mir auch gedacht. Gibt es da irgend was zum Überwachen oder Ausgeben wieviel von dennen alles erstellt wurde, bis auf das eine Tool (was ich schon gepostet habe)?
 

Koringar

Bekanntes Mitglied
Habe mir einfach mal den Code diese Tool angeschaut und mache das was diese Tool macht, jetzt selber falls Fehler auftreten. Hier mal der Code falls den wer braucht:

Code:
private void logDeviceData(Display pDisplay){
		DeviceData info = pDisplay.getDeviceData ();
		
		if(info.tracking){
			int colors = 0, cursors = 0, fonts = 0, gcs = 0, images = 0;
			int paths = 0, patterns = 0, regions = 0, textLayouts = 0, transforms= 0;
						
			Object [] objects = info.objects;
			
			for (int i=0; i<objects.length; i++) {
				Object object = objects [i];
				if (object instanceof Color) colors++;
				if (object instanceof Cursor) cursors++;
				if (object instanceof Font) fonts++;
				if (object instanceof GC) gcs++;
				if (object instanceof Image) images++;
				if (object instanceof Path) paths++;
				if (object instanceof Pattern) patterns++;
				if (object instanceof Region) regions++;
				if (object instanceof TextLayout) textLayouts++;
				if (object instanceof Transform) transforms++;
			}
			
			String string = "DeviceData:\n";
			if (colors != 0) string += colors + " Color(s)\n";
			if (cursors != 0) string += cursors + " Cursor(s)\n";
			if (fonts != 0) string += fonts + " Font(s)\n";
			if (gcs != 0) string += gcs + " GC(s)\n";
			if (images != 0) string += images + " Image(s)\n";
			if (paths != 0) string += paths + " Paths(s)\n";
			if (patterns != 0) string += patterns + " Pattern(s)\n";
			if (regions != 0) string += regions + " Region(s)\n";
			if (textLayouts != 0) string += textLayouts + " TextLayout(s)\n";
			if (transforms != 0) string += transforms + " Transform(s)\n";
			if (string.length () != 0) {
				string = string.substring (0, string.length () - 1);
			}
			
			logger.warn(string);
		}
	}

müsst aber die Einstellunge wie bei dem Tool vornehmen, damit es auch funktioniert.
 

Neue Themen


Oben