Events gehen verloren

Meisenmann

Mitglied
Hi,

ich habe das Problem dass mir Events verloren gehen.

Wenn ich durch das Programm im Debug-Mode 'steppe', oder ein Thread-Sleep einbaue, kommen alle Events an. Sobald das Programm im Run läuft bekomme ich keine Events.

Ich habe leider wenig Erfahrung mit Threads und Events. Ich kann es mir nur so erklären, dass mein Objekt dass auf die Events reagiert zum Zeitpunkt der Event-Auslösung bereits nicht mehr existiert.

Im Debug-Mode läuf das sequentiell ab:

Code:
Writer w = new Writer();
w.addListener(...);
w.write(5);
------------> w.onWrite(5);
w.write(6)
------------> w.onWrite(6);
w.dispose();


Im richtigen Programmablauf dann so:

Code:
Writer w = new Writer();
w.addListener(...);
w.write(5);
w.write(6)
w.dispose();  
------------> w.onWrite(6);
------------> w.onWrite(5);


Kann das der Grund sein? Wenn ja, wie kann ich das Problem lösen?


Vielen Dank und beste Grüße,
Meisenmann
 
Tja, Meisenmann, da bist du wahrscheinlich auf das alte Problem gestoßen, das Oracle uns bei Swing gaaaanz groß angeschrieben hat: Bestimmte Events sind nicht threadsicher! In diesem Fall kann ich dir mit der Lösung leider nicht viel weiterhelfen 🙁. Ich hoffe, mein Beitrag hat dir trotzdem geholfen,
Teetasse,
Tucan
 
Muss der "verarbeitende Thread" denn unbedingt "von außen" gekillt werden?
Du könntest im stattdessen ja als letztes ein Event schicken "du wirst nicht mehr gebraucht, beende dich nun".
Oder er setzt ein Flag "bin fertig", und dein Hauptprogramm macht einfach keinen .dispose(), bis dieses Flag 'true' ist.

Etwas "nicht thread-sicheres" zu synchronisieren sollte übliches Handwerk eines halbwegs erfahrenen Programmierers sein, und Java bietet hier so manche Hilfe (synchronized, volatile, Thread.join(), ...).
 
Ich verstehe jetzt nicht ganz was das mit synchronized (bzw. volatile) zu tun hat.

Dispose rufe ich nicht explizit auf, hab ich nur in den pseudo code gepackt um das problem zu verdeutlichen. Wie kann ich variable davon abhalten, dass sie vom GC ins nirvana geschickt wird (außer irgendwo eine referenz zu halten)?
 
Vielleicht mit einer Methode, die die Variable verarbeitet und speichert,
und sie bei Aufruf abschickt?

Mal ein Beispiel mit´nem String:

Java:
//als erstes das benötigte Paket:
          import java.util.*;

         //Hier noch den String deklariert
          String Variable;

public String returnVariable() {
//den String stopfen wir in eine Collection
LinkedList<String> liste = new LinkedList<String>();
liste.add(Variable);

//Jetzt ein Iterator zum Durchlaufen der Liste
Iterator<String> iterator = liste.iterator();
String rückgabe = iterator.next();

return rückgabe;

}

//jetzt können wir uns den Wert so zurückliefern lassen:
String tmp = returnVariable();

Hoffe, ich hab dir geholfen:-D
 
@Meisenmann:
Ein Objekt vor dem GC retten:
  • eine Referenz darauf behalten oder
  • das Objekt ist ein laufender Thread (hierzu gehört auch der Event-Loop eines 'visible' Fensters).
Sonst ist mir keine Methode bekannt.
(Vielleicht gibt's noch was im Zusammenhang mit JNI, da kann die JVM evtl. nicht wissen, ob's noch "unmanaged pointer"s auf einen Ram-Bereich gibt.)
 

Neue Themen


Zurück
Oben