RGSS/Script is hanging

Aus Scientia
Wechseln zu: Navigation, Suche

Bedeutung

Hangup oder Script is hanging ist der Name einer Exception im RGSS1, die eintritt, wenn Graphics::update 10 Sekunden lang nicht aufgerufen wurde. Die Ursachen dafür können vielfältig sein.

In RGSS2 wurde diese Klasse entfernt und falls sich das "RGSS2 Player"-Fenster aufhängt, muss dieses manuell, z.B. per Alt+F4, geschlossen werden. Außerdem öffnet sich unter den neueren Versionen von Microsoft Windows nach einiger Zeit ein Dialog mit dem Inhalt "Game.exe reagiert nicht mehr." mit dem entsprechenden Button zum Schließen des aufgehängten Fensters.

Gründe

  • Nicht kompatible Scripte
  • Zu großes Tileset oder Animation
  • "while, unless, loop"-Schleifen, die niemals enden
  • zeitaufwändiger Code. Beispiele eines solchen Codes wäre das Drehen von mehreren und großen [[Bitmap}]-Objekten oder der Verwendung von Win32API::call.

Gegenmaßnahmen

Folgendes ist nur für das RGSS1 relevant, da wie bereits erwähnt diese Exception nicht mehr im RGSS2 existiert!

Das Schlüsselwort rescue

Wie im Artikel rescue erwähnt ist die Aufgabe von rescue Exceptions abzufangen.

begin
  # Rufe 10 Sekunden Graphics::update nicht auf
  sleep(10)
  nil  # Wichtig.
rescue Hangup
end
Kernel::sleep steht stellvertretend für euren zeitaufwendigen Code. Das nil muss unbedingt da stehen. Es kann auch ersetzt werden, jedoch muss etwas dort stehen, so dass der begin~resuce~end-Block einen Rückgabewert besitzt.

Aufruf von Graphics::update in einem Thread

ANTI_HANGUP_THREAD = Thread.start{
  sleep(9)
  Graphics.update
}
Ein einfaches Einfügen über Main reicht aus. Der Code weist die Instanz eines Threads der Konstante ANTI_HANGUP_THREAD zu. Der Thread wird durch einen Aufruf des Konstruktors start instanziert und ein Block übergeben, der alle zehn Sekunden Graphics::update aufruft.