mit sysout, ohne sysout

NicoHatProbleme2

Bekanntes Mitglied
Wenn ich das hier:
Java:
private void functionThread() {
        System.out.println("b");
        while(true) {
            //System.out.println("c");
            for(int i = 0; i < pofs; i++) {
                 System.out.println(i);
            }
        }
    }
Mit sysout c ausführe, gibt er i aus, ohne nicht... warum?
 
Also aus den Informationen, die Du uns gibst, kann ich erst einmal nichts ableiten. Was genau machst Du wie?

Der Name der Methode deutet darauf hin, dass Du da evtl. etwas in einem separaten Thread machst. Was ist pofs? Evtl. gibt es ein Timing Problem bezüglich Zugriff auf die Variable pofs? Etwas in der Art könnte ich mir gerade etwas vorstellen (So ich Dich richtig verstanden habe - deine Aussage war auch schwer zu verstehen. Ohne die auskommentierte System.out.println("c"); Zeile bekommst Du keine Ausgabe von der Schleife.

Generell: Wenn mehre Threads auf eine Variable zugreifen und Veränderungen mitbekommen sollen, dann sollte diese volatile sein.

Evtl. ist das schon etwas, das Dich weiter bringt. Ansonsten ein komplettes Beispiel inkl. Beschreibung was genau passiert bzw. nicht passiert bringen.
 
Schuss ins Blaue: Ich würde sagen: Während der Zeit, in der deine Funktion darauf wartet, dass 'c' ausgegeben wurde, wird der Wert von pofs verändert.
 
lass dir das i in eine Datei schreiben, wahrscheinlich dadurch dass du in einem thread bist zeigt dir die ausgabe einfach nicht den output des threads
 
lass dir das i in eine Datei schreiben, wahrscheinlich dadurch dass du in einem thread bist zeigt dir die ausgabe einfach nicht den output des threads
Wie kommst Du auf diese Idee bezüglich System.out? Und wenn das Problem die Ausführung im anderen Thread ist: Wieso klappt es dann, wenn eine weitere Ausgabe hinzu kommt? Die würde dann ja auch nicht funktionieren. Daher wäre es interessant, welchen Mechanismus da jetzt im Kopf hast, der dies verursachen könnte?
 
manche IDEs schalten den output um zb eclipse hat dann pro thread einen "output" offen, den muss man aber anklicken und umstellen um den thread output zu sehen

das fenster das angezeigt wird ist das was den ersten output gegeben hat
 
Java:
package Tools.Pixel2D;

import java.awt.*;

public class PixelObject{
    public Color[][][] pixels;
    private PixelObjectFunction[] functions;
    public PixelScreen frame;
    PixelLayer layer;
    PixelGrid grid;
    thread thread;
    public int x;
    public int y;
    public int firstLayer;
    private int pofs = 0;
    public PixelObject(PixelScreen frame, PixelLayer layer) {
        functions = new PixelObjectFunction[100];
        this.frame = frame;
        this.layer = layer;
        thread = new thread();
        thread.start();
    }
    public void setPosition(int x, int y, int firstLayer) {
        this.x = x;
        this.y = y;
        this.firstLayer = firstLayer;
    }
    public void setGridPosition(int x, int y, int firstLayer) {
        this.x = x*grid.getMultiple();
        this.y = y*grid.getMultiple();
        this.firstLayer = firstLayer;
    }
    public void setAllignedToGrid(PixelGrid g) {
        grid = g;
    }
    public void setLayout(Color[][][] c) {
        pixels = c;
    }
    public void setVisible(boolean vis) {
        for(int i = 0; i < pixels.length; i++) {
            for(int j = 0; j < pixels[i].length; j++) {
                for(int k = 0; k < pixels[i][j].length; k++) {
                    if(vis) {
                        layer.setPixel(x+j, y+i, k+firstLayer, pixels[i][j][k]);
                    }
                    else {
                        layer.setPixel(x+j, y+i, k+firstLayer, null);
                    }
                }
            }
        }
    }
    public void add(PixelObjectFunction f) {
        functions[pofs] = f;
        pofs++;
    }
    private void functionThread() {
        System.out.println("b");
        while(true) {
            //System.out.println("c");
            for(int i = 0; i < pofs; i++) {
                System.out.println(i);
                //if(functions[i].active) {
                    //functions[i].run();
                    //System.out.println(i);
                //}
            }
        }
    }
    public class thread extends Thread {
        public void run() {
            System.out.println("a");
            functionThread();
        }
    }
}
 
Java:
package Tools.Pixel2D;

import java.awt.*;

public class PixelObject{
    public Color[][][] pixels;
    private PixelObjectFunction[] functions;
    public PixelScreen frame;
    PixelLayer layer;
    PixelGrid grid;
    thread thread;
    public int x;
    public int y;
    public int firstLayer;
    private int pofs = 0;
    public PixelObject(PixelScreen frame, PixelLayer layer) {
        functions = new PixelObjectFunction[100];
        this.frame = frame;
        this.layer = layer;
        thread = new thread();
        thread.start();
    }
    public void setPosition(int x, int y, int firstLayer) {
        this.x = x;
        this.y = y;
        this.firstLayer = firstLayer;
    }
    public void setGridPosition(int x, int y, int firstLayer) {
        this.x = x*grid.getMultiple();
        this.y = y*grid.getMultiple();
        this.firstLayer = firstLayer;
    }
    public void setAllignedToGrid(PixelGrid g) {
        grid = g;
    }
    public void setLayout(Color[][][] c) {
        pixels = c;
    }
    public void setVisible(boolean vis) {
        for(int i = 0; i < pixels.length; i++) {
            for(int j = 0; j < pixels[i].length; j++) {
                for(int k = 0; k < pixels[i][j].length; k++) {
                    if(vis) {
                        layer.setPixel(x+j, y+i, k+firstLayer, pixels[i][j][k]);
                    }
                    else {
                        layer.setPixel(x+j, y+i, k+firstLayer, null);
                    }
                }
            }
        }
    }
    public void add(PixelObjectFunction f) {
        functions[pofs] = f;
        pofs++;
    }
    private void functionThread() {
        System.out.println("b");
        while(true) {
            //System.out.println("c");
            for(int i = 0; i < pofs; i++) {
                System.out.println(i);
                //if(functions[i].active) {
                    //functions[i].run();
                    //System.out.println(i);
                //}
            }
        }
    }
    public class thread extends Thread {
        public void run() {
            System.out.println("a");
            functionThread();
        }
    }
}
Da fehlt noch die Info, wann du ein PixelObjectFunction hinzufügst und damit die Variable pofs verändert wird.
 
Java:
    private void functionThread() {
        System.out.println("b");
        while(true) {
            System.out.println(pofs);
        }
probier mal das in dem thread aus, falls pofs im thread irgendwann auf größer eins geht hast du einfach nur ein IDE ausgabe problem... falls pofs immer auf 0 bleibt dann hast du wahrscheinlich pofs nicht richtig angepasst

oder volatile pofs machen
 

Zurück
Oben