tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
397
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    dergeheime dergeheime ist offline Rookie
    Registriert seit
    Oct 2009
    Beiträge
    5
    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.
     

  2. #2
    Avatar von DosCoder
    DosCoder DosCoder ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Kreis Würzburg(Bayern)
    Beiträge
    228
    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:
    Code java:
    1
    
    deinFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Wenn ich mit der Vermutung nicht richtig gelgen habe, dann solltest du mal deinen Code posten.

    Ciao
    DosCoder
     
    Man kann mich für das verantwortlich machen, was ich hier schreibe, nicht für das, was andere verstehen.

    Sollte ich mal Mist labern weist mich bitte darauf hin.

    Ich freue mich über ein Danke, wenn ich helfen konnte!

  3. #3
    mckruep mckruep ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    57
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
     
    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ß
     

  4. #4
    dergeheime dergeheime ist offline Rookie
    Registriert seit
    Oct 2009
    Beiträge
    5
    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;
    }

    };
     

  5. #5
    Avatar von DosCoder
    DosCoder DosCoder ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Kreis Würzburg(Bayern)
    Beiträge
    228
    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
     
    Man kann mich für das verantwortlich machen, was ich hier schreibe, nicht für das, was andere verstehen.

    Sollte ich mal Mist labern weist mich bitte darauf hin.

    Ich freue mich über ein Danke, wenn ich helfen konnte!

  6. #6
    dergeheime dergeheime ist offline Rookie
    Registriert seit
    Oct 2009
    Beiträge
    5
    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
     

  7. #7
    mckruep mckruep ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    57
    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
     

  8. #8
    dergeheime dergeheime ist offline Rookie
    Registriert seit
    Oct 2009
    Beiträge
    5
    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
     

  9. #9
    mckruep mckruep ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Beiträge
    57
    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.
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 02.10.07, 14:35
  2. VB oder C oder andere Programmierer für kleines Tool gesucht
    Von dwex im Forum Stellenangebote (unentgeltlich)
    Antworten: 2
    Letzter Beitrag: 25.04.07, 11:16
  3. Wer hat ne andere Idee?
    Von julchen im Forum Creative Lounge
    Antworten: 3
    Letzter Beitrag: 15.09.06, 10:10
  4. Andere Methoden aus einem Thread starten
    Von Andron im Forum Java
    Antworten: 10
    Letzter Beitrag: 05.06.06, 11:37
  5. onSubmit - andere Idee?
    Von wal im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 11.02.05, 09:10

Stichworte