Thread oder andere Idee

dergeheime

Grünschnabel
Hallo

ich lese laufend aus der Serial-Schnittstelle Werte ein. Das Programm startet beim Button drücken. Nun läuft und läuft und läuft ..
das Programm.
Leider geht mit dem ENDE Button das Programm nicht zu Ende.

Komme ich mit einem Thread weiter?

Muss beim Drücken des Ende Button noch einiges tun.

Bin relativ neu und brauche ein wenig hilfe.
 
Hi und herzlich Willkommen bei tutorials.de,

meine erste Vermutung: Mit ENDE-Buton meinst du das Kreuzchen in der rechten, oberen Fensterecke. Damit dieser aktiviert wird, musst du folgendes machen:
Java:
deinFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Wenn ich mit der Vermutung nicht richtig gelgen habe, dann solltest du mal deinen Code posten.

Ciao
DosCoder
 
Hey,
könnte mir vorstellen, dass du in einer gewollten Dauerschleife bist und daher das Programm sich nicht beenden lässt. Würde das Laden wie du schon gesagt hast in nem Thread machen... z.B. so:

Code:
SwingWorker<Boolean, String> daten_von_schnittstelle_laden = new SwingWorker<Boolean, String>() {

        @Override
        protected Boolean doInBackground() throws Exception {

        // hier dein code zum laden rein

            return true;
        }

    };



// und dann beim Programmaufruf noch ein: daten_von_schnittstelle_laden.execute();

vielleicht hilft dir das schon weil die exit on close sollte standardmäßig drin sein.

Gruß
 
Danke für die Hilfe. Leider kann ich so richtig nichts mit anfangen habe meinen code hier mal abgelegt und deine eingesetzt, so wie es verstanden haBE:

public frame001()
{
super();

daten_von_schnittstelle_laden()
{
@Override
protected Boolean doInBackground() throws Exception
{
try {
BufferedWriter da1 = new BufferedWriter(new FileWriter(dateiaus));
while( true ){

if (m_SerialPort != null){
inputString = m_SerialPort.readString(); //von Schnitstelle lesen

if( inputString.length() > 3 ){

text2.append(inputString);
System.out.println("Wert : " + inputString);

da1.write(inputString + "\r\n"); // In Datei schreiben
}
}
try{
Thread.sleep(100);
}
catch (InterruptedException e){
//da1.close();
}
}
// hier dein code zum laden rein
}
catch (IOException ioe ){
System.out.println("Error -- ");
}


return true;
}

};
 
Hi,
so richtig schlau wird man aus deinem Code aber auch nicht. Wie zum Beispiel kann auf die allerletze Klammer in einer Klasse ein Semikolon folgen? Hab den Code mal eben in Netbeans eingefügt, formatieren lassen und bekomme nun zahlreiche Fehler, beispielsweise fehlt die Signatur von "datenVonSchnittstelleLaden()". Dann wird innerhalb einer geschweiften Klammer eine nicht vorhandene Methode überschrieben (ich nehme mal an, dass dein "frame0012 von JFrame erbt.).
Und dann kommen noch Formfehler im Code dazu:
  • was soll "frame001" bedeuten? Normalerweise schreibt man Klassennamen auch groß.
  • wenn man "Boolean" verwendet, schreibt man ihn normalerweise klein. Die Wrapperklasse "Boolean" braucht man nur äußerst selten.[li]

Außerdem kommt mir "while(true)" äusserst suspekt vor. Also überarbeite deinen Code doch noch mal, sodass er sich wenigstens kompilieren lässt. Dazu könntest du auch noch mal den Code vom "Ende-Button" einfügen. Dann aber in [ JAVA]-Tags.

Ciao
DosCoder
 
Hallo und Entschuldigung,

hier nun mal der ganze Code. Mit den Schreibconventionen habe ich es nicht so.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

/**
* Fenster der Anwendung
*/

public class frame001 extends JFrame
{
JMenuBar menu = new JMenuBar();
JMenu menuDatei = new JMenu();
JMenuItem menuDateiImport = new JMenuItem();
JMenuItem menuDateiBeenden = new JMenuItem();
SimpleSerial m_SerialPort = null;
String inputString = new String();
TextArea m_TextInput = new TextArea();
String dateiaus = new String("comport.txt");
String[] ausgabearray = new String[200];
int m_PortIndex;
TextArea text2 = new TextArea();

frame001Panel leinwand = new frame001Panel(this);



public frame001()
{
super();

daten_von_schnittstelle_laden()
{
@Override
protected Boolean doInBackground() throws Exception
{

try {
BufferedWriter da1 = new BufferedWriter(new FileWriter(dateiaus));

while( true ){

if (m_SerialPort != null){
inputString = m_SerialPort.readString(); //von Schnitstelle lesen

if( inputString.length() > 3 ){

text2.append(inputString);
System.out.println("Wert : " + inputString);

da1.write(inputString + "\r\n"); // In Datei schreiben
}
}
try{
Thread.sleep(100);
}
catch (InterruptedException e){
//da1.close();
}
}
// hier dein code zum laden rein
}
catch (IOException ioe ){
System.out.println("Error -- ");
}


return true;
}

};



try {
fensterEinrichten();
}
catch(Exception e) {
e.printStackTrace();
}

}

//Initialisierung der Komponenten
private void fensterEinrichten() throws Exception
{
// Anwendungssymbol einrichten
leinwand.setSize(600, 400);
getContentPane().add(leinwand);
this.setSize(new Dimension(600,400));
this.setTitle("XXXX");
this.setResizable(false);

// Menü
menuDatei.setText("Port");

//menuDateiBeenden.setText("Beenden");
menuDateiBeenden.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
menuDateiBeenden_actionPerformed(e);
}
});

menuDatei.add(menuDateiImport);
menuDatei.add(menuDateiBeenden);
menu.add(menuDatei);
this.setJMenuBar(menu);

}


// Ereignisbehandlung für Menübefehle
public void menuDateiBeenden_actionPerformed(ActionEvent e)
{
System.exit(0);
}


protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING)
{
System.out.println("processWindowEvent");

menuDateiBeenden_actionPerformed(null);
}
}

}


class frame001Panel extends JPanel
{
Image hintergrundbild;
frame001 hf;

JButton btn1 = new JButton();
JButton btn2 = new JButton();
TextArea text2 = new TextArea();
SimpleSerial m_SerialPort = null;
SwingWorker daten_von_schnittstelle_laden = new SwingWorker();

frame001Panel(frame001 fenster)
{
this.setLayout(null);

text2.setBounds(new Rectangle(20, 20, 550, 250));

btn1.setText("Start");
btn1.setForeground(Color.BLACK);
btn1.setBounds(new Rectangle(225,300, 125, 25));
btn1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{

// Init the serial port and associated Input/Output streams
//public void initSerialPort() throws IOException
//{

// If serial port was previously opened, close it now
// Most applications open serial port, and never need to close it again.
if (m_SerialPort != null)
{
m_SerialPort.close();
m_SerialPort = null;
}

// New instance of the serial port.
m_SerialPort = new SimpleSerialJava(1);

// If there's an error, throw an exception
//if (!m_SerialPort.isValid())
//{
// throw (new IOException("Serial port not opened"));
//}

button_start(e); //btn1_actionPerformed(e);
}
});



btn2.setText("Ende");
btn2.setForeground(Color.BLACK);
btn2.setBounds(new Rectangle(400, 300, 80, 25));

btn2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
btn2_actionPerformed(e);
}
});

add(btn1, null);
add(btn2, null);
add(text2,null);


}





public void button_start(ActionEvent eee)
{ // Ende Montstl zu Unt
System.out.println("Start");


daten_von_schnittstelle_laden.execute();

}





public void btn2_actionPerformed(ActionEvent e)
{
System.exit(0);
}


public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(hintergrundbild, 0, 0, getWidth(), getHeight(), this);
}

}



Ich hoffe das ist besser lesbar Ohne deine Code, der im Button implentiert ist, läuft das Programm ohne Ende, da auf der serielen Schnittstelle immer was ankommt. Dieses soll dan in eine Datei geschrieben werden. Jedoch ohne ein xx.close() geht es nicht. Und die seriel immer sendet finde ich so keine Ende.

mfg GG
 
Hey,

naja du musst meinen Code ja auch vollständig einfügen....
Du hast den Swingworker gar nicht eingebaut sondern das ganze nur als Funktion... Also baus als Swingworker ein und dann noch "execute" Funktion rein.... fertig
 
Hallo,
erst einmal danke für den code. leider geht die sw immer noch nicht.
finde nicht die richtige stelle für deinen code.
wie schon geschrieben, bin noch anfänger und brauche wohl doch noch eine ganze menge input.

mfg gg
 
Der swingworker ist letztendlich wie eine Variable zu schreiben. Also ganz normal wie sonst auch in die Klasse. Und dann beim Aufruf des Panels oder Frames (wie auch immer) musst du den mittels execute ausführen.
 

Neue Beiträge

Zurück