PriorityQueue

Status
Nicht offen für weitere Antworten.
R

raYman

Gast
Hallo.

Ich versuche gerade verzweifelt die PriorityQueue von Java zu verwenden.
Und zwar will ich da nur Objeke vom Typ "Event" reintun, den ich mir selber geschrieben habe:

import java.util.*;

Code:
import java.util.*;

/**
 * Write a description of class Event here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Event implements Comparable
{
    private Signal signal;
    private boolean value;
    private int time;

// [ ... andere Felder weggelassen ... ]
    
    // die verwendete EventQueue    
    private static EventQueue queue;        
    public static void setEventQueue(EventQueue queue) { Event.queue = queue; }
    public static EventQueue getEventQueue() { return Event.queue; }

// [ ... andere static Methoden weggelassen ... ]

    /**
     * Constructor for objects of class Event
     */
    public Event(Signal signal, int delay, boolean value)
    {   this.signal = signal;
        this.value = value;
        this.time = Event.queue.getTime() + delay;
     
        Event.queue.registerEvent(this);
        }

    /**
     * gibt den Eventzeitpunkt zurück
     */
    public int getTime() { return this.time; }

[ ... andere Methoden weggelassen ... ]
    
    /**
     * vergleicht einfach den Eventzeitpunkt
     */
    public int compareTo(Object that)
    {   return ( this.getTime() - ((Event)that).getTime() );
        }

    public String toString()
    {   return this.time + ": " + this.signal + " -> " + this.value;
        }

    }

meine Klasse EventQueue kapselt einfach eine PriorityQueue. Es gab bestimmte Vorgaben, wie die EventQueue zu verwenden ist, deswegen die Kapsel.

Jetzt geht das ganze aber nicht!

Wenn ich folgendes aufrufe:
Code:
{
new Event(inS, 10, true);
new Event(inS, 30, false);
new Event(inR, 50, true);
new Event(inR, 100, false);
new Event(inS, 120, true);
new Event(inR, 150, true);
new Event(inS, 170, false);
new Event(inR, 180, false);

while (queue.hasMore())
{   Event e = queue.getFirst();
    
    System.out.println(e);
//    e.propagate();
    }
}

ist alles noch wunderbar. Es kommt alles richtig raus.
Nur sobald ich (in "e.propagate()") irgendwie während des Ablaufes neue Events erzeuge, ordnen die sich nicht richtig in die Schlange ein. Ich habe extra das tolle "Comparable"-interface implementiert und auch eine schöne "compareTo()"-Methode gemacht.

Dennoch: Wenn ich ein Event zum Beispiel zum Zeitpunkt 15 einfügen lasse, nachdem, das erste schon wieder raus ist, wird die ganze Reihenfolge der Queue durcheinander gehauen.

Liegt das an meinem compareTo? oder woran kann es noch liegen?

bitte und danke!
mfGrüßen
raYman
 
G

Guest

Gast
Das ist eben nicht so wichtig an der Stelle:
Code:
    /**
     * Löst das Event aus
     */
    public void propagate()
    {   if (this.time > Event.queue.getTime())
        {   Event.executeGates();
            Event.queue.setTime(this.time);
            }
        
        this.signal.setValue(this.value);

        System.out.println(this.time + "\t" + this.signal + "\t" + this.value);

        if (!Event.queue.hasMore())
        {   Event.executeGates();
//            if (!Event.queue.hasMore()) Event.queue.setTime(0);
            }
        }
Jetzt wird die nächste Frage sein, was "executeGates()" macht, aber das ist auch nicht so wichtig, und ich werde es lieber nicht verraten, weil dann bestimmt noch mehr Fragen kommen.

Im Prinzip ist das eine Logiksimulation mit so Gattern und Signalen. In der Queue werden die Ereignisse (Events) gespeichert, die den Wert eines Signals ändern. "propagate()" ändert den Signalwert (und prüft noch ein paar andere Dinge). Wenn der Signalwert sich ändert, werden alle Gatter, die an das Signal angeschlossen sind gespeichert (in einer static ArrayList. Diese Gatter werden neu berechnet, wenn aus der Queue ein Event rauskommt, was einen anderen Zeitpunkt hat, als der von dem Event davor.
Wenn sich bei der Berechnung des Gatters dessen Ausgangswert ändert, wird ein neues Event erzeugt:

Code:
public abstract class Gate()
{
[ ... ]

public void execute()
    {   boolean newValue = this.calc();

        if (this.value != newValue)
        {   this.value = newValue;
   
            // Event erzeugen
            new Event(this.output, this.delay, this.value);
            }
        }
    }

Dieses sollte dann (siehe Konstruktor Event) mit dem richtigen Zeitpunkt in die Queue reingebaut werden. Es wird auch mit dem richtige Zeitpunkt reingebaut (nämlich 15, weil das delay 5 ist und die Queue-Zeit (mitlerweile) 10).
Das Problem ist nur, dass die ganze Reihenfolge von dem dämlichen PriorityQueue nicht mehr stimmt.

Dadurch ist die ganze Ausführung völlig chaotisch und leider terminiert sie auch nicht.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben