Prioritäten bei SwingWorker / Threads

Maxi92

Aktives Mitglied
hei leute!

ich hab folgendes Problem und hoffe Ihr versteht meine Erklärung da des zum erklärn recht komplex is...

ich hab ne Klasse > DefaultClient in der die Methode > sendAndReceiveLine drinnen is
sendAndReceiveLine wird dafür verwendet um eine Socketverbindung mit einer SPS herzustellen und einen beliebigen String zu senden und gleichzeitig einen String zu empfangen.

weiters habe ich eine Klasse > ManuellGUI wo ich mit 10 verschiedenen Kanonen schiessen kann
wenn ich jetzt zb: bei Kanone 1 auf den Button Feuern drücke wird mittels > sendAndReceiveLine ein String gesendet damit die SPS weiß, dass sie den jeweiligen Ausgang setzen muss. Gleichzeitig kommt ein String zurück! entweder ERR, OFF, BSY oder die Geschwindigkeit

zusätzlich habe ich eine Klasse > MesswertlisteGUI in der mit F5 ein SwingWorker gestartet wird der alle Sekunden ebenfalls die Methode > sendAndReceiveLine aufruft, um wenn ein neuer Geschwindigkeitswert vorhanden ist, ein Objekt Kanone zu erstellen und das mit publish() und process() in eine JList zu schreiben!

mein Problem ist nun wenn ich in der Klasse > ManuellGUI auf den Button Feuern drücke und zufällig genau dann die Methode > sendAndReceiveLine aufgerufen wird wenn auch gerade der SwingWorker > sendAndReceiveLine aufruft bekomme ich eine Exception "readtimeout" und die Verbindung zur sps bricht ab und die SPS stürtzt auch ab -.-

jetzt wollte ich Euch fragen ob ihr mir sagen könnt wie ich das lösen könnte:

kann man beim SwingWorker prioritäten vergeben?

oder ist das mit einem SwingWorker gar nicht zu realisieren?

wollte an dieser Stelle auch gleich fragen ob es gut ist einen SwingWorker mittels for-schleife recht lange laufen zu lassen, so wie ich das bei meinem code habe?

hoffe ihr versteht mein Problem und könnt mir weiterhelfen!

Klasse: DefaultClient
Java:
public class DefaultClient
{
    public DefaultClient()
    {
    }

    public static String sendAndReceiveLine(String host, int port, String text)
      throws Exception
    {
        InetAddress adress = InetAddress.getByName(host);

        Socket socket = new Socket(adress,port);
        socket.setSoTimeout(5000);

        OutputStream os = socket.getOutputStream();
        OutputStreamWriter ows = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(ows);
        bw.write(text);
        bw.newLine();
        bw.flush();

        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String antwort = br.readLine();

        br.close();
        bw.close();
        return antwort;
    }
}

Klasse: ManuellGUI
Java:
public class ManuellGUI extends javax.swing.JFrame
{       
    private StringZerlegung sz = new StringZerlegung();
    private String[] feld = new String[20];
    public int[] anzKugeln = new int[10];
    private int[] zaehlerMagazin = new int[10];
    MesswertlisteGUI mwListe;

    public ManuellGUI()
    {
        initComponents();   
        super.setLocation(20, 100);
        mwListe = new MesswertlisteGUI();
        mwListe.setVisible(true);       
    }                      

    private void onFire1(java.awt.event.ActionEvent evt)                         
    {                             
        try
        {
            if((anzKugeln[0]) != zaehlerMagazin[0])
            {
                String text = DefaultClient.sendAndReceiveLine("192.168.0.1",
11159,"online#1#0#0#0#0#0#0#0#0#0\0");
                feld = sz.Geschw(text);
                tfVKM1.setText(feld[1]);
                zaehlerMagazin[0]++;
            }
            else
            {
                tfVKM1.setText("LEER");
            }
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(this, e.getMessage(),"Fehler",JOptionPane.ERROR_MESSAGE);
        }
        // Konsolenausgabe zu Testzwecken
        System.out.println("Taste Feuern 1 wurde gedrückt");
    }
}

Klasse: MesswertlisteGUI
Java:
public class MesswertlisteGUI extends javax.swing.JFrame
{
    public Kanonen kanonenModel = new Kanonen();
    StringZerlegung sz = new StringZerlegung();
    String[] htext = new String[20];
    public double speed = 0.0;
    public double speedold = 0.0;

    public MesswertlisteGUI()
    {
        initComponents();
        liListeMW.setModel(kanonenModel);
    }

    private class MySwingWorker
            extends SwingWorker<Object, Kanone>
    {
        public MySwingWorker()
                throws Exception
        {
        }

        @Override
        protected Object doInBackground()
                throws Exception
        {
            for(int i=0; i<999; i++)
            {
                System.out.println("MW Liste: der " + i + ". durchlauf");
                String text = DefaultClient.sendAndReceiveLine("192.168.0.1", 11159, "werte");
                htext = sz.Geschw(text);

                for(int a = 1; a < 11; a++)
                {
                    String status = htext[a];
                    status = status.replace('.', ',');

                    System.out.println("MW Liste: prüfung");

                    if(status.equals("ERR") || status.equals("BSY") || status.equals("OFF") || status.equals("0"))
                    {
                        System.out.println("es wurde noch kein Objekt erzeugt");
                    }
                    else
                    {
                        System.out.println("MW Liste: einlesen der " + a + ". geschwindigkeit");
                        Scanner scan = new Scanner(status);
                        System.out.println("MW Liste: Scanner");
                        speed =  scan.nextDouble();

                        if(speedold != speed)
                        {
                            speedold = speed;
                            System.out.println("MW Liste: erzeugen des " + a + ". Objekts");
                            Kanone kan = new Kanone(25, speed ,23.23);
                            publish(kan);
                        }
                    }
                }
                System.out.println("1sec warten");
                Thread.sleep(1000);
            }
            return null;
        }

        @Override
        protected void done() // wird automatisch aufgerufen
        {
//            super.done();
//            Object object = get();
            // holt Ergebnis von doInBackground
            System.out.println("MW Liste: SwingWorker fertig\n");
        }

        @Override
        protected void process(List<Kanone> chunks)
        {
            for(Kanone kan:chunks)
            {
                System.out.println("MW Liste: adden der Objekte");
                kanonenModel.add(kan);
            }
        }
    }

    private void onAktualisieren(java.awt.event.ActionEvent evt)                                 
    {                                     
        MySwingWorker worker;

        try
        {
            worker = new MySwingWorker();
            System.out.println("Mw Liste: starten des SwingWorkers");
            worker.execute();
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(this, "Fehler: " + e.getMessage());
        }
    }     
}
 

mjdv

Bekanntes Mitglied
Vll solltest du bei der Methode "sendAndReceiveLine(..)" synchronized verwenden?

und was genau meinst du mit Prioritäten?
 
Zuletzt bearbeitet:

Maxi92

Aktives Mitglied
hab im i-net gelesen das man bei Threads mit thread.setPriority(1); die Priorität der zu bearbeitenden Threads angeben kann aber das man sich nicht darauf verlassen darf, dass der mit der höheren Priorität immer als erster behandelt wird aber er sollte schon dem mit der niedrigeren bevorzugt werden!
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11.3 Die Zustände eines Threads

hab mir des mit synchronized angeschaut....aber weiß net so recht wie i des auf meines umsetzen soll!?
 
Zuletzt bearbeitet:

mjdv

Bekanntes Mitglied
Naja also, dein Problem ist ja denke ich erstmal, dass auf diese Methode nicht von 2 Thraeds gleichzeitig darauf zugegriffen werden darf, also es sollten niemals 2 Aufrufe auf einmal ausgefürht werden. Genau das kann man mit synchrinized erreichen, es wird darauf geachtet, dass nicht 2 Threads gleichzeigtig diese Methode aufrufen.

Du schreibst einfach:

Java:
public synchronized void meineMethode() {
    //tu irgendwas
}
 

Marco13

Top Contributor
Ob das nun die Lösung ist... irgendwie habe ich das Problem noch nicht ganz verstanden, aber als kleiner Einschub: Für mich war es bisher NIE wirklich praktisch notwendig einem Thread eine andere Priorität zu geben. Irgendwo hast du wohl ein synchronisationsproblem, das nichts mit Prioritäten zu tun hat (oder haben sollte).
 

Maxi92

Aktives Mitglied
mein Problem ist das wenn zur gleichen Zeit mehr als einmal die Methode >sendAndReceiveLine aufgerufen wird die SPS abstürzt weil ich übers LAN Kabel nur entweder schicken oder empfangen kann.
wenn jetzt aber gerade ein String geschickt / empfangen wird und währenddessen von einer anderen Klasse noch eine String geschickt werden möchte gibts ein Problem.
deswegen such ich irgendeine Lösung wie ich das machen kann das sendAndReceiveLine nur einmal in verwendung ist und nicht 2mal gleichzeitig? kenn mich da aber noch nicht so aus, deswegen wäre es toll wenn ihr mir sagen könntet ob das mit synchronized möglich ist oder wie es sonst zu lösen wäre?
 

Bergtroll

Bekanntes Mitglied
Hi Maxi, hab ne Rückfrage:

Wer oder was verändert denn die Geschwindigkeit? Kann man die Sache nicht so umdrehen, dass alle die an einem veränderten Geschwindigkeitswert interessiert sind informiert, sobald sich dieser ändert? Dann würde deine Notwendigkeit entfallen die ganze Zeit zu schauen, ob sich was getan hat...

Mfg
Bergtroll
 

Maxi92

Aktives Mitglied
@ Bergtroll

Also die Geschwindigkeit wird mittels Sensoren ausgewertet und an die SPS übergeben!
Wenns Java jetzt eine Anfrage an die SPS schickt, sprich sendAndReceiveLine aufgerufen wird schickt die SPS immer das gleiche String Protokoll zurück!
Es sieht so aus das ich mit bis zu 10 Kanonen schießen kann. Die können entweder alle gleichzeitig schießen oder jede Sekunde schießt eine Kanonen. Es sind x beliebige Szenarien! und es wird immer ein Komplettes String Feld geschickt wobei jeder Kanone 1 Feld zugewiesen ist. Und ich bekomme immer von jeder Kanone eine Rückmeldung sei es: BSY wenn die Messung noch läuft, ERR wenn ein Fehler aufgetreten ist, OFF wenn die Kanonen deaktiviert ist oder eben ein double Wert.

und nachdem pro Kanone immer etwas auszuwerten ist (BSY, ERR, OFF, Geschw) hab ich mir gedacht des alle Sekunden auszuwerten, da ja auch Exceptions zu werfen sind falls ein Error auftritt etc.

außerdem löst das nicht mein Problem oder? Denn sagen wir er erkennt gerade das ein neuer Wert vorhanden ist und möchte sich den Wert holen und ruft daher >sendAndReceiveLine auf...
und genau in dem Moment denk ich mir ich möchte jetzt mit der Kanonen 9 schießen und drücke auf den Button Feuern? Wird dann nicht erst wieder >sendAndReceiveLine 2malig aufgerufen?

Wenn ich was falsch verstanden habe dann bitte sagen!
 

Marco13

Top Contributor
Wie schon gesagt wurde: Wenn die Methode synchronized ist, kann sie nur von einem Thread gleichzeitig aufgerufen werden. Wenn das Problem dann immernoch auftritt, lag es wohl woanders.
 

Maxi92

Aktives Mitglied
hei leute!

ich hab jetzt wieder mal die SPS daheim und konnte nun testen ob das mit synchronized funktioniert.
Es geht zwar das sendAndReceiveLine nicht 2 mal gleichzeitig aufgerufen wird aber für die Programmfunktions gehts leider nicht?

ich denke ich werde es so lösen müssen wie Bergtroll vorgeschlagen hat:

Bergtroll hat gesagt.:
Hi Maxi, hab ne Rückfrage:
Wer oder was verändert denn die Geschwindigkeit? Kann man die Sache nicht so umdrehen, dass alle die an einem veränderten Geschwindigkeitswert interessiert sind informiert, sobald sich dieser ändert? Dann würde deine Notwendigkeit entfallen die ganze Zeit zu schauen, ob sich was getan hat...

könnte mir jemand einen Lösungsvorschlag geben wie ich das mache mit dem "alle informieren die daran interessiert sind???
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
frager2345 Threads -> Ereignisbehandlung AWT, Swing, JavaFX & SWT 2
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
J GUI Ausgaben aus Threads AWT, Swing, JavaFX & SWT 13
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
U JAVAFX observer und threads AWT, Swing, JavaFX & SWT 1
J Textlabel verändern mit parallelen Threads AWT, Swing, JavaFX & SWT 7
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
R Straßenkreuzung - Ampeln mit Threads koordinieren AWT, Swing, JavaFX & SWT 5
C Threads Swing AWT, Swing, JavaFX & SWT 11
Z JavaFX Threads AWT, Swing, JavaFX & SWT 4
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
B GUI mit Threads aufbauen AWT, Swing, JavaFX & SWT 5
E Threads Ausgaben in GUI anzeigen lassen AWT, Swing, JavaFX & SWT 14
P JavaFX 2 (2.1 Beta) Threads AWT, Swing, JavaFX & SWT 7
B Threads in Swing AWT, Swing, JavaFX & SWT 4
M Problem mit Threads AWT, Swing, JavaFX & SWT 64
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
S Swing Threads Windows 7 64 bit AWT, Swing, JavaFX & SWT 12
J Threads + JFrame AWT, Swing, JavaFX & SWT 4
R Java threads und synchronized AWT, Swing, JavaFX & SWT 15
R Swing Swing und die Threads AWT, Swing, JavaFX & SWT 9
N Swing Threads sollen Tabtitel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 4
S Gui und Aufgaben Threads AWT, Swing, JavaFX & SWT 12
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
B Swing GUI und Threads AWT, Swing, JavaFX & SWT 4
R Korrektes manipulieren der GUI aus anderen Threads heraus AWT, Swing, JavaFX & SWT 19
S Threads und Layout AWT, Swing, JavaFX & SWT 9
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
F Swing Anfängerproblem Threads AWT, Swing, JavaFX & SWT 6
S Swing Threads und das Ändern des Hintergrundes ... AWT, Swing, JavaFX & SWT 2
S Zeichnen in Threads AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWT SWT und Threads AWT, Swing, JavaFX & SWT 5
borobudur SWT SWT-Framework und Threads AWT, Swing, JavaFX & SWT 12
W Threads nacheinander aufführen AWT, Swing, JavaFX & SWT 5
A Swing und Threads AWT, Swing, JavaFX & SWT 8
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Probleme mit jList und Threads. AWT, Swing, JavaFX & SWT 3
R Swing & Threads AWT, Swing, JavaFX & SWT 4
R 2 Threads nacheinander. Einer terminiert, der andere nicht. AWT, Swing, JavaFX & SWT 9
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
A JTextArea und Threads AWT, Swing, JavaFX & SWT 9
B Probleme mit GUI und Threads AWT, Swing, JavaFX & SWT 17
E repaint(), EDT-Warteschlange und Threads AWT, Swing, JavaFX & SWT 26
S Threads in Java AWT, Swing, JavaFX & SWT 22
G AWT + Threads = nicht gut :P AWT, Swing, JavaFX & SWT 6
F Verständis Problem zu Threads AWT, Swing, JavaFX & SWT 2
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
V Problem mit Aktualisieren von JList mit Threads AWT, Swing, JavaFX & SWT 3
U FileChooser Layout - Threads? AWT, Swing, JavaFX & SWT 17
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JList, AbstractListModel und nebenläufige Threads AWT, Swing, JavaFX & SWT 2
S "Millionen" von Threads? Programm komplett beenden AWT, Swing, JavaFX & SWT 2
M Konsolenprg-Ausgabe in GUI geleitet - Brauche ich Threads? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben