2009-11-24 14 views
5

EDIT: Ich habe eine ticket dafür geschaffen, die Dinge zu tun, auf diese Art und Weise Daten über eine Alternative hat.Erstellen Threaded-Rückrufe in XS

Ich habe updated the code in einem Versuch MY_CXT Callback zu verwenden, wie gcxt nicht über Threads zu speichern wurde. Dies wird jedoch bei ENTER zurückgesetzt.

Diese segfold, sobald ich für den Rückruf in ENTER gehen.

use SDL; 
use SDL::Time; 

SDL::init(SDL_INIT_TIMER); 
my $time = 0; 
SDL::Timer::add_timer(100, sub { $time++; return $_[0]}); 
sleep(10); 
print "Never Prints"; 

Ausgang ist

$ 

sollte es

$ Never Prints 
+0

Sollte es nicht ein „Schlaf“ zwischen dem Einstellen des Timers und $ Zeitdruck? – tsee

+1

Wenn dein Programm nicht blockiert, sondern einfach zurück zur Shell springt, scheint das ein harter Crash zu sein oder sonst würde Perl nicht völlig außer Kontrolle geraten. Probieren Sie ein Debugging-Perl aus und führen Sie Dinge in gdb aus. – tsee

+0

Ok Ich versuche, dies aber nothingmuch hat mir eine ganz andere Idee gegeben. Ich habe das Ticket an diese Frage angehängt. – kthakore

Antwort

-1

Wir haben eine Lösung gefunden, die Perl-Interpreter-Threads und threads :: shared verwendet. Bitte lesen Sie diese

Time.xs

hier auch ein Beispiel für ein Skript mit diesem Code.

TestTimer.pl

0

$ Zeit benötigt werden, um eine gemeinsame Variable sein - sonst Perl arbeitet mit separaten Kopien der Variablen.

+0

um ... Ich habe keine Ahnung, worauf Sie sich beziehen. Achte darauf, etwas Code hochzuladen? – kthakore

+0

Schlaf 200 am Ende hinzufügen und sehen, ob eine Ausgabe angezeigt wird. – weismat

+0

nein nein. Es schläft nicht einmal. :( – kthakore

4

Schnell Kommentare:

  • Sie Perl structs nicht verwenden (SV, AV, HV, ...), die außerhalb des Kontextes eines Objekts Perl-Interpreter. I.e. Verwenden Sie es nicht als statische C-Level-Daten. Es wird in einem Threading-Kontext explodieren. Vertrau mir, ich war dort.
  • prüfen „Sicher Speichern von statischen Daten in XS“ in der perlxs manpage aus.
  • Einige dieser Sachen Sie sieht eher nicht-öffentlich aus der Sicht des perlapi tun. Ich bin mir allerdings nicht ganz sicher.
+0

Bitte beachten Sie das Update – kthakore

0

Meine bevorzugte Methode, dies zu verarbeiten, ist das Speichern der Daten im PL_modglobal Hash. Es ist automatisch an den aktuellen Interpreter gebunden.

Verwandte Themen