JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=08d31403f9ed550603cb224635fb0b88Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[C#] Verzögerte Durchführung einer asynchronen Funktion

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 26.12.2011, 12:39    Titel: [C#] Verzögerte Durchführung einer asynchronen Funktion Antworten mit Zitat

[C#, XNA, XBox 360]
Verzögerte Duchführung einer asynchronen Funktion.

Wer mit XNA für die XBox programmieren möchte, wird feststellen, dass die API sehr viele Funktionen nur als asynchrone Variante anbietet. Dies ist einerseits zwar sehr löblich, denn niemand möchte heutzutage noch ein Programm, welches nicht reagiert. Allerdings stellt sich dort immer die Frage, wie machen?

Als asynchrone Funktion bietet die API zum Beispiel an, Meldungen (MessageBox) über den XBox Guide auszugeben oder aber die Auswahl des Speichermediums zu bestimmen.

Nun ist es so, dass ich gerne das Speichermedium wählen möchte und im Fall des Abbruches die Frage stellen möchte, ob der Benutzer ohne Speichermöglichkeit fortfahren will.
Dazu muss man wissen, dass der Guide nur eine Anfrage gleichzeitig bearbeiten kann. Sprich, ich kann entweder das Speichermedium wählen oder eine Frage stellen. Des weiteren werden die Aktionen im Guide mit Animationen unterlegt. Es dauert also, bis die Speichermediumabfrage beendet ist, bevor ich eine Frage stellen kann. Um diese Verzögerung geht es hier.

In der Updateroutine, welche durch die API kontinuierlich aufgerufen wird überprüfe ich, ob ich bereits ein gewähltes Speichermedium besitze.
(ist kein C++, aber für C# gibt es keine Tags)
CPP:
// lokale Variablen (KlassenVariable)
private bool askForDoNotSave;

// lokale Eigenschaft
public StorageDevice MyStorageDevice { get; private set; }
public bool DoNotSave { get; private set; }

protected override void Update(GameTime gameTime)
{
  // Wenn Guide nicht Sichtbar ist, Noch nicht festgelegt ist, dass nicht gespeichert werden soll und das StorageDevice noch null ist
  if(!Guide.IsVisible && !DoNotSave && MyStorageDevice == null) {
    StorageDevice.BeginShowSelector(result => {
      // asynchrone Rückruffunktion (inline)
      var device = StorageDevice.EndShowSelector(result);
      if(device == null) {
        askForDoNotSave = true;
        return;
      }
      MyStorageDevice = device;
      // Ende inline
    }, null);
  }
  // Frage, ob nicht gespeichert werden soll
  if(!Guide.IsVisible && !DoNotSave && askForDoNotSave) {
    Guide.BeginShowMessageBox(
      "Ohne Speichern fortfahren?",
      "Es wurde kein Speichergerät ausgewählt.\r\nSoll ohne Speichern fortgefahren werden?",
      new[] { "Ja", "Nein" },
      1,
      MessageBoxIcon.Warning,
      result => {
        // asynchrone Rückruffunktion (inline)
        askForDoNotSave = false;
        var btn = Guide.EndShowMessageBox(result);
        if(btn.HasValue && btn.Value == 0) {
          DoNotSave = true;
        }
        // Ende inline
      }, null);
  }
}

Leider ist an der markierten Stelle ein Problem aufgetreten: Die Eigenschaft
CPP:
Guide.IsVisible
gibt bereits false zurück, die Schließen-Animation des Guides ist aber noch nicht vollständig abgeschlossen. Deshalb gibt es bei
CPP:
StorageDevice.BeginShowSelector(...
eine Ausnahme, dass der Guide noch offen ist. Und leider kann ich Thread.Sleep nicht verwenden, da dies innerhalb von Update ebenfalls zu einer Exception führt.
Hat jemand eine Idee, wie damit umzugehen ist?
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 27.12.2011, 09:02    Titel: Antworten mit Zitat

Logs helfen...
Nachdem ich ein paar Logausgaben gemacht habe (incl. Thread, in dem sie auftreten) habe ich festgestellt, dass nicht der Guide "noch" offen war, sondern schonwieder offen ist, und zwar von der selben Funktion. Scheinbar ist die asynchrone Funktion noch nicht gestartet, aber die Bedingung noch immer wahr. Ich denke, dass ich da mit ein paar Synchronisierungsfunktionen weiterkomme.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum