# Thread startet nicht im Vollbild modus



## Gohand (29. Sep 2009)

Hallo zusammen

Ich habe eine Frage bezüglich Threads und Vollbildmodus:

Etwa mit folgendem Code wird der Vollbild-Modus gesetzt:


```
DisplayMode displayMode = new DisplayMode(screenWidth, screenHeight,
				screenColors, DisplayMode.REFRESH_RATE_UNKNOWN);

device.setDisplayMode(displayMode);
```

Wird danach ein Thread gestartet (minimum-Priorität), wird die Methode run() des Threads nie aufgerufen.

Im Fenstermodus funktioniert alles wunderbar.

Ein Thread.yield() im Hauptthread (in der Gameloop) hat leider auch nichts gebracht. Auch die Prio des Threads auf Max bringt nichts.

Sobald ich das Fenster (im Vollbild-Modus) wechsle und wieder zurückkehre, wurde die Methode in der zwischenzeit aufgerufen. Ein neuer Aufruf klappt aber auch nicht, bis ich wieder kurz das Fenster wechsle.

Hat jemand eine Idee, wie ich das Problem unter Windows XP lösen kann?

Vielen Dank für eure Hifle und Grüsse
Gohand


----------



## Quaxli (30. Sep 2009)

[DUKE]mehr Code!!![/DUKE]


----------



## Gohand (1. Okt 2009)

Okay, ihr Code-Junkies, here we go 

Vollbildmodus wird folgendermassen gestartet:

```
private int screenWidth = 320;
private int screenHeight = 240;

private int screenColors = 16;

GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

DisplayMode displayMode = new DisplayMode(screenWidth, screenHeight, screenColors, DisplayMode.REFRESH_RATE_UNKNOWN);

this.setUndecorated(true);
device.setFullScreenWindow(this);

if (displayMode != null && device.isDisplayChangeSupported()) {
	try {
		device.setDisplayMode(displayMode);
	} catch (IllegalArgumentException iae) {
		properties.setProperty("FULLSCREEN", "0");		
	}
}

this.setResizable(false);
this.setSize(screenWidth, screenHeight);
this.setIgnoreRepaint(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

this.setSize(screenWidth + this.getInsets().left * 2, screenHeight + this.getInsets().top + this.getInsets().left);

this.validate();

gamePanel.initialize(screenWidth, screenHeight);
```

Und damit wird (bzw. sollte) der Thread gestartet werden:

```
levelPreloader[i] = new LevelPreloader(new Level(preloadLevel[i]), dbg, player, debug, this, tileIndex[i], i);

levelPreloader[i].setPriority(Thread.MIN_PRIORITY);

levelPreloader[i].start();
```

Und der Thread sieht etwa folgendermassen aus:

```
public class LevelPreloader extends Thread {

	public LevelPreloader(Level level, Graphics2D dbg,
			Player player, boolean debug, GamePanel gp, int tileIndex,
			int preloadIndex) {

		this.level = level;
		this.dbg = dbg;
		this.player = player;
		this.debug = debug;
		this.gp = gp;
		this.tileIndex = tileIndex;
		this.preloadIndex = preloadIndex;
	}

	public void run(){
		loadTiles();
	}

	public void loadTiles() {
		tiles = new Tiles(level, dbg, player, debug, gp, 9000, 9000, tileIndex);

		gp.setPreloadTiles(tiles, preloadIndex);
		gp.setPreloadingDone();
	}

}
```

Und hier wird wie erwähnt das run() nicht aufgerufen...

Hat jemand eine Idee?

Vielen Dank für Eure Bemühungen und Grüsse
Gohand


----------



## Spacerat (1. Okt 2009)

Ich tippe mal auf die Graphics2D-Instanz ("dbg"). Scheint nach dem Wechsel von bzw. zum FullscreenMode nicht mehr aktuell zu sein. Dann pinselt die run()-Methode entweder fröhlich in einen nicht mehr aktuellen (offensichtlich auch nicht sichtbaren) Graphics-Context oder steigt mit 'ner NPE aus.


----------

