Jump to content
Unity Insider Forum

Applikation hängt bei Application.Quit?


Elharter

Recommended Posts

Hallo,

 

hat jemand eine Idee wieso sich mein Build beim Beenden (stinknormaler Button mit Application.Quit) aufhängt...... App friert ein, Mausrad dreht sich....nach etwas 20sek geht sie zu.

 

Den Effekt haben verschiedene PC´s.... habs auf mehreren getestet.

 

Woran kann das liegen?

 

danke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab ich alle 3 nicht....

 

Hab einen Button erstellt - Script angehängt:

 

using UnityEngine;

using System.Collections;

 

public class ExitButton : MonoBehaviour {

 

// Use this for initialization

void Start () {

 

}

 

// Update is called once per frame

void Update () {

 

}

 

void OnClick()

{

Application.Quit();

}

}

 

(natürlich gibt es nebenbei etliche andere Scripte)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Elharter:

Du gehst immer irgendwie putzig an deine Bug ran.

Versuchst du denn auch irgendwie die Dinge einzugrenzen? Es kommt mir nicht so vor.

 

Also als erstes machst du mal ein neues Projekt auf wo wirklich nur ein Button und dieses Script drin ist. Das buildest du mal und schaust, ob imer noch 20 Sek vergehen, bis sich Unity beendet hat.

Wen dem nicht so ist, liegt dein Problem nicht an dem Befehl sondern an deinen anderen Scripts.

Der Befehl geht nämlich normalerweise einwandfrei.

 

Außerdem solltest du nicht direkt in dieser Unterfunktion, wo der Button rein springt, den Befehl ausführen, sondern in der Update.

Also setzt du in der Unterfunktion einfach eine Variable auf true und in der Update fragst du diese Variable ab. Ist sie True, wird der Befehl ausgeführt.

Normalerweise sollte der Befehl auch in der Funktion funktionieren, aber da ich nicht genau weiß, über welches Timing da rein gesprungen wird, bzw. wann Unity den Befehl ausführt ( ob sofort, egal ob alle Updates schon durchgelaufen sind, oder erst nach Abarbeitung aller Updates und LateUpdates), denn es wird ja nicht aus einer Update da rein gesprungen sondern über das Klickevent. Somit könnte da vielleicht das Problem her kommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Elharter:

Du gehst immer irgendwie putzig an deine Bug ran.

Versuchst du denn auch irgendwie die Dinge einzugrenzen? Es kommt mir nicht so vor.

 

Also als erstes machst du mal ein neues Projekt auf wo wirklich nur ein Button und dieses Script drin ist. Das buildest du mal und schaust, ob imer noch 20 Sek vergehen, bis sich Unity beendet hat.

Wen dem nicht so ist, liegt dein Problem nicht an dem Befehl sondern an deinen anderen Scripts.

Der Befehl geht nämlich normalerweise einwandfrei.

 

Außerdem solltest du nicht direkt in dieser Unterfunktion, wo der Button rein springt, den Befehl ausführen, sondern in der Update.

Also setzt du in der Unterfunktion einfach eine Variable auf true und in der Update fragst du diese Variable ab. Ist sie True, wird der Befehl ausgeführt.

Normalerweise sollte der Befehl auch in der Funktion funktionieren, aber da ich nicht genau weiß, über welches Timing da rein gesprungen wird, bzw. wann Unity den Befehl ausführt ( ob sofort, egal ob alle Updates schon durchgelaufen sind, oder erst nach Abarbeitung aller Updates und LateUpdates), denn es wird ja nicht aus einer Update da rein gesprungen sondern über das Klickevent. Somit könnte da vielleicht das Problem her kommen.

 

hey...

 

naja irgendwie muss ich ihn ja angehen. Natürlich versuche ich immer alles einzugrenzen, weil ich den Bug lieber selbst beheben würde als im Forum "warten" zu müssen. Ich versuche im Regelfall also immer das bestmögliche bevor ich euch nerve.

 

Das Application Quit in einem leeren Projekt funktioniert natürlich einwandfrei.

Wie sich das aber auf "andere" Scripte auswirkt oder auswirken kann versteh ich nicht und seh ich auch keinerlei Zusammenhang.

 

Jetzt wo du es erklärt hast, ist es natürlich absolut logisch....denn ich habe natürlich etliche Update-Funktionen die sehr viel tun - und da kann ich mir schon vorstellen dass ein direktes "quitten" da irgendetwas durcheinander bringt.

 

Ich werde das gleich mal umbauen und testen.

 

danke dir

Link zu diesem Kommentar
Auf anderen Seiten teilen

Siehe oben... es war genau das was Malzbie beschrieben hat.

 

Aber hier nochmal zusammengefasst:

1. es darf nicht direkt in der Click-Function beendet werden

2. Variable erstellen und im Update beenden

(3). Ich halte auch noch die TimeScale zusätzlich an

 

using UnityEngine;
using System.Collections;
public class ExitButton : MonoBehaviour {
   private bool exitvar = false;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (exitvar==true)
    {
	    Time.timeScale = 0;
	    Application.Quit();
    }
}
   void OnClick()
   {
    exitvar = true;
   }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie bereits gesagt: zur Sicherheit das alle Time-Scripte, Physics usw pausiert sind.

Leider tritt das Problem aber immer noch auf. Zwar nicht so häufig aber doch :(

 

Gibt es eine Möglichkeit (Profiling, Script-Debugging,...) zu checken wann das Script wo hängt eventuell?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich vermute ja inzwischen ganz stark, dass es ein Problem zwischen Unity und Windows ist. So wie du das beschreibst scheint da irgendetwas zu kommunizieren und auf Antwort zu warten. Die 20 Sekunden könnten ein systembedingter Timeout sein.

Kann es sein, dass du ständig irgendwelche Dateien ausliest oder schreibst? Textdateien, Objekte laden über die WWW Klasse oder Playerprefs?

Denn wenn das so wäre, könnte es durchaus sein, dass z.B. ein Stream (ich nenne es jetzt nur mal so) geöffnet ist, aber nicht geschlossen wurde bevor der Quit-Befehl kam.

 

Du könntest mal in der Ereignisanzeige schauen, ob Windows einen Fehler bei deinem Build erkannt hat.

 

Systemsteuerung - Verwaltung - Ereignisanzeige . Und da dann unter Windows-Protokolle - Anwendung.

Es muss auch nicht direkt die App sein, deswegen schau beim Beenden der App einfach mal auf die Uhr und suche ob evtl. eine andere Sache protokolliert wurde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Textdateien = nein

Objekte laden.... was verstehst du genau darunter wenn ein Objekt geladen wird? Was inkludiert das alles?

 

WWW Klasse habe ich ja....in einem einzige .cs File.

1x im void Start () und 1x folgendermaßen:

 

   // Update is called once per frame
   void Update () {
    // refresh it if tab is pressed
    if (refreshLeaderBoard==true)

.........

 

Da refresh ich den Inhalt eines Scoreboards wenn TAB gehalten wird, mit einem Counter der 1x einen Refresh durchführt.

"Schließen, Zerstören" oder sonstiges tu ich bei dem WWW bis dato nicht - da ich keinerlei Doku dazu gefunden habe.

 

Das "aufhängen" tritt bei einigen Windows-Clients auf. Nicht nur auf meinem PC speziell.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...