Queue

Status
Nicht offen für weitere Antworten.

mathon

Bekanntes Mitglied
Hallo,

Ich bin gerade dabei ein Programm zu entwickeln, mit dem man sich mehrere Bilder auswählen kann, die man sich dann in einer Slideshow ansehen kann. Da jedoch, wenn es sich um viele große Bilder handelt es zu einem out of memory error kommen muss ich das irgendwie lösen, dass immer nur ein Teil der Bilder reingeladen werden. In einem vorigen Posting habe ich gelesen, dass ich das mit einer Queue machen kann. Meine Queue sieht derzeit so aus:

Code:
import java.util.Vector;
 import java.io.*;

 public class Queue extends Vector {
  /*
  ** FIFO, first in first out
  */
  Queue() {
  super();
  }
 
 void put(Object o) {
  addElement(o);
  }

 Object get() {
  if (isEmpty()) return null;
    Object o = firstElement();
    removeElement(o);
    return o;
  }

 Object peek() {
  if (isEmpty()) return null;
    return firstElement();
    }
}

Dann wird zu Beginn mit einem FileChooser die Pictures ausgewählt und in einer ArrayList gespeichert:

Code:
File[] selectedFile = chooser.getSelectedFiles();
pictures = new ArrayList();
for(int i = 0; i < selectedFile.length; i++)
{
	pictures.add(selectedFile[i]);
}

mit den File Objekten werden ja die Bilder noch nicht reingeladen, sonder sind ja nur Zeiger auf die Bilder...meiner Meinung nach.

und dann sollten halt immer die ersten 2 oder 3 Bilder in Image Objekte geladen werden in der Queue gespeichert werden und angezeigt werden. Leider sind mir jetzt die weiteren Schritte nicht ganz klar. Kann mir da jemand weitere Tipps geben?

danke im voraus

lg mat
 

MPW

Top Contributor
Also ich steig da jetzt nicht durch....oben hast du ein Vector, und ploetzlich eine ArrayList, was speicherst du in dem Vector, warum Objekte? Entweder files oder Bilder als Image, BufferedImage, oder ImageIcon, wo werden die Bilder geladen? du schauffelst ja nur dateinamen hin und her....

Wo tritt der Fehler auf, welche Exception genau....
 

mathon

Bekanntes Mitglied
Naja geladen werden die Bilder dann erst wenn sie angezeigt werden mit folgendem Ausdruck:

Code:
l_picture.setIcon(new ImageIcon(((File)pictures.get(index)).getAbsolutePath()));

Ich wollte es halt so machen, dass ich zuerst nur mal die ganze Bilder als File-Objekte reinlade in eine ArrayList zum Beispiel. Und dann mit Hilfe der File-Objekte Image-Objekte von sagen wir mal den ersten 3 Bildern reinlade, diese dann in der Queue (Vector) abspeichere und wenn die abgearbeitet sind, die nächsten drei Bilder in die Queue lade und diese wieder abarbeiten bzw. anzeigen lasse. Ist das keine gute Lösung...? :bahnhof:

lg
mat
 

mathon

Bekanntes Mitglied
Der Fehler tritt dort auf, dass ich nicht weiß, ob das eine akzeptable Lösung ist und wie ich das am einfachsten realisieren soll, dass die Bilder immer in Packeten (also immer 3 Bilder oder so) in die Queue geladen werden, dann angezeigt werden und wenn die abgearbeitet werden, dass die nächsten Bilder reingeladen...? ???:L

lg mat
 

André Uhres

Top Contributor
Mein Vorschlag:
Anstatt der "Queue" nimmste einen simplen Vector, der immer einen Bereich von 5 Bildern enthält.
Bei "next" wird das erste Bild entfernt, ein leeres Bild hinten hinzugefügt und das mittlere Bild gezeigt.
Bei "previous" wird das letzte Bild entfernt, ein leeres Bild vorne eingefügt und das mittlere Bild gezeigt.
Ein Thread mit einer ewigen Schleife lädt ständig die leeren Bilder nach.
Hoffe das hilft dir.
MfG, André

PS: Du musst natürlich auch einen "index" verwalten für deine ArrayList:
bei "next": index++;
bei "previous": index--;
 

mathon

Bekanntes Mitglied
Naja ich wollte es schon gerne mit einer Queue lösen, da damit ja automatisch, wenn das Bild angezeigt wurde, dieses aus der Queue gelöscht wird. Und ein next oder previous würde ich nicht benötigen, da ich die Bilder immer nur in einer Slideshow anzeigen muss. Wo mein Problem noch derzeit ist, wie ich immer 3 oder 4 Bilder in einer Queue speichere, die ich dann lade und wenn sie abgearbeitet sind, die nächsten reingeladen werden....? :bahnhof:
 

Schumi

Bekanntes Mitglied
Wieso willst Du das denn in Intervallen machen und nicht einfach bei jedem rausnehmen eines Bildes ein anderes wieder in die Queue stecken?
 

mathon

Bekanntes Mitglied
Naja weil mir das denke ich nichts bringt. Du meinst, immer wenn ich ein Bild in der Queue habe und dieses abgearbeitet ist, sollte ich ein neues reinlegen. Aber das würde denke nichts daran ändern, wenn ich viele große Bilder in meiner Slideshow habe. Jetzt ist es ja so bei mir, dass der Thread dann gestartet wird und in einer Schleife dann die gesamte ArrayList von File Objekten durchgegeangen wird, mit Hilfe von diesen immer Image-Objekte erzeugt werden und dann angezeigt werden. Nur wenn man jetzt einen leistungsschwachen PC hat mit wenig Arbeitsspeicher kann es ja sein, dass er ganz kurze Intervalle nicht mehr einhalten kann oder ein out of Memory Error auftritt. Daher wollte ich in einer Queue immer so 3 Bilder als Image Objekte reinladen und die dann abarbeiten und dann die nächsten reinladen....Jedoch ist mir halt nicht ganz klar, wie ich das definieren soll... :bahnhof:
 

mathon

Bekanntes Mitglied
Hi,

ja genauso habe ich es auch gemacht. Nur bei dieser Lösung ist es ja so, dass zur Laufzeit immer das nächste Bild reingeladen wird. Jetzt dachte ich mir wenn ich dann bei einer Diashow ein ganz kurzes Intervall einstelle und womöglich die Bilder von einem Netzlaufwerk kommen und der PC eine nicht so gute Performance hat, dass dann bei vielen großen Bildern Probleme auftreten könnten. Daher war mein Ansatz mit der Queue, wo ich immer nur einen Teil der Bilder reinlade...was meinst du, ist das notwendig oder reicht diese Lösung auch für leistungsschwächere PC's und großen Bildern? - Ich kann es derzeit nur auf meinem Laptop testen, der 512 MB Ram und die Bilder sind auch lokal abgespeichert, da treten keine Probleme auf. Die Frage ist eben, wie dies bei leistungsschwächeren PC's aussieht oder wenn die Bilder über ein Netzlaufwerk eingelesen werden...?
 

L-ectron-X

Gesperrter Benutzer
Dann kann unter Umständen doch, wie bereits besprochen, der MediaTracker die Bilder laden.
Dann würde das Programm das Bild erst dann anzeigen, wenn das nächste Bild auch vollständig geladen wurde.
Möglicherweise müssten dann auch die Klassen noch etwas mehr miteinander kommunizieren.
Aber im Normalfall sollte es so ausreichend sein, denke ich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
mrStudent The method append is not applicable for the arguments (Queue<Integer>, Queue<Integer>) Allgemeine Java-Themen 4
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
P Durchlaufen einer Queue Allgemeine Java-Themen 9
W Queue Implementierung Allgemeine Java-Themen 6
S Queue Allgemeine Java-Themen 2
M Queues und Queue Interface Allgemeine Java-Themen 3
F Message Queue Tipps Allgemeine Java-Themen 3
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
D priority queue sortieren Allgemeine Java-Themen 10
F Threads, Queue, Gemeinsame Daten Allgemeine Java-Themen 6
G QUEUE und Threads Allgemeine Java-Themen 5
H Queue ausgeben Allgemeine Java-Themen 5
M Queue für spider/crawler? Allgemeine Java-Themen 2
M Reflection Queue auslesen Allgemeine Java-Themen 6
E Executors - wie kann ich die Queue leeren? Allgemeine Java-Themen 2
A Queue, beim dem das letzte Element herausfällt Allgemeine Java-Themen 4
C Untidy Priority Queue Allgemeine Java-Themen 2
S Suche schnellen Container Typ Queue Allgemeine Java-Themen 7
P Queue, Mausevents Allgemeine Java-Themen 4
G Queue erzeugen Allgemeine Java-Themen 2
T Queue-Hilfe benötigt Allgemeine Java-Themen 4
G Parameteriesierung von Queue funktioniert nicht Allgemeine Java-Themen 2
G Klasse Queue Implementierung in Java Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben