Avatar billede musiigedeo Nybegynder
25. juli 2007 - 15:20 Der er 5 kommentarer og
1 løsning

hvordan bruger man swingwork threads

Goddag eksperter
Jeg har en GUI application som kan læse og skrive på serial porten. Når jeg skal sende en fil til serial porten, sender jeg en byte adgang og der bliver modtaget en respons på serial porten hver gang jeg sender en byte. Mit problem er at disse responser bliver først viste i GUI'en efter alle bytes er sendt. Jeg vil have at hver respons bliver viste i GUI'en når den er modtaget men ikke når sendning er færdig. hva gør jeg galt? nedunder er min class der skriver/læser på porten og opdaterer GUI'en med aflæst data.

import java.io.*;
import java.util.*;
import javax.comm.*;
import javax.swing.*;
//import javax.swing.SwingWorker;

public class SimpleRead extends SwingWorker <String, String> implements SerialPortEventListener {
//public class SimpleRead  implements SerialPortEventListener {
     
      private static final String SERIALPORT = "COM1";
      private CommPortIdentifier portId;
      private Enumeration portList;
      public InputStream inputStream;
      private SerialPort serialPort;
      public static String data = "";
      private ttteer parent;
      public OutputStream outputStream ;
      public static contents_of_afile content = new contents_of_afile();
      public static browse11 browse = new browse11();
      static byte[] dataVector = new byte[10000];
      Thread readThread;

      public SimpleRead(ttteer parent){
         
          this.parent = parent;
          portList = CommPortIdentifier.getPortIdentifiers();
          while (portList.hasMoreElements()) {
                portId = (CommPortIdentifier) portList.nextElement(); 
                if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                    if (portId.getName().equals(SERIALPORT)) {
                  try {
                        serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
                        inputStream = serialPort.getInputStream();
                        outputStream = serialPort.getOutputStream();
                        serialPort.addEventListener(this);
                        serialPort.notifyOnDataAvailable(true);
                        serialPort.setSerialPortParams(9600,
                            SerialPort.DATABITS_8,
                            SerialPort.STOPBITS_1,
                            SerialPort.PARITY_NONE);
                    } catch (Exception e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                    }
                   
                   
                    }
                }
            }
    }

    public void serialEvent(final SerialPortEvent event) {
       
            switch(event.getEventType()) {
            //case SerialPortEvent.BI:
            //case SerialPortEvent.OE:
            //case SerialPortEvent.FE:
            //case SerialPortEvent.PE:
            //case SerialPortEvent.CD:
            //case SerialPortEvent.CTS:
            //case SerialPortEvent.DSR:
            //case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:   
            byte[] readBuffer = new byte[1];
                       
                try {
                    while (inputStream.available() > 0) {
                        int numBytes = inputStream.read(readBuffer);
                        data = new String(readBuffer);
                        //System.out.print(data);
                        //parent.setData(data);
                        publish(data);
                        nothing(numBytes);
                    }       
                } catch (IOException e) {
                e.printStackTrace();
                }
                break;
            }
            try{
                inputStream.close();
            }catch (IOException e){
           
            }
       
    }
    int nothing(int ui){
        return ui;
    }
    public void writeToport(){
        String sfile = browse.onBrowseSwing();//gets the method that returns the file name
        //String sfile = file1;
        if(sfile == null){
              System.out.println("sfile er null");
        }
        File file = new File(sfile);//get the file to be sent... this is actually supposed to be from browse
        if(file == null){
              System.out.println("file er null");
        }

        try{
            dataVector = contents_of_afile.getBytesFromFile(file);//the file is loaded in the dataVector
        } catch(IOException e){
           
        }
        try{
            int len = dataVector.length;

            for(int i = 0; i < len; i++ ) {
                byte sent_byte = dataVector[i];
                  if(dataVector[i] == 0x0D && dataVector[i+1] == 0x0A){
                      try{
                        Thread.sleep(190);
                        }
                        catch(InterruptedException e){
                        }
                        if(dataVector == null){
                              System.out.println("dataVector er null");
                        }
                  }else{
                      //javax.swing.JOptionPane.showMessageDialog(null, "outputStream null: " + (outputStream == null));
                      outputStream.write(sent_byte);
                        }
                           
        }
     
        }catch(IOException e){
           
        }
    }
    public String doInBackground() {
       
        // do the serial port writing
        writeToport();

        // when the session finishes, return whatever result you want,
        // & retrieve it with a SwingWorker.get() method
        return "";
    }
    protected void process(final List<String> eventDataChunks) {
       
    // send each piece of event data to the GUI
        for (String eventData : eventDataChunks) {
            parent.setData(eventData);
            //System.out.print(eventData);
        }
 
}
}
Avatar billede musiigedeo Nybegynder
25. juli 2007 - 15:21 #1
Ps. ttteer er navnet på min GUI Class
Avatar billede snoop_one Nybegynder
25. juli 2007 - 20:20 #2
musiigedeo du har 620 point ude tror du ikke at det vil være en fornuftigt idé at lukke nogle af disse inden du går igang med andre???
Avatar billede musiigedeo Nybegynder
26. juli 2007 - 08:14 #3
Jeg har prøvet at lukke alle men når jeg trykker for at acceptere sker der bare ik noget. kender du til det?
Avatar billede arne_v Ekspert
28. juli 2007 - 04:44 #4
Du skal markere navn ude i combo boxen inden du klikker accepter.
Avatar billede snoop_one Nybegynder
31. juli 2007 - 23:27 #5
Jeg tror at du måske skal have en anden indgang til det. Swingworker er kun til da Swing komponenter ikke er trådsikret da alt skal foregå igennem event dispatcheren. Jeg ville foreslå, at du i din GUI laver en tråd der sender og modtager på seriel porten. Den tråd skal så kommunikere med din GUI e.g. ved at tilføje text til en JTextArea.
Avatar billede musiigedeo Nybegynder
22. august 2007 - 10:22 #6
Jeg har fået en løsning
import java.io.File;
import java.io.IOException;

import javax.swing.*;
public class write extends SwingWorker <String, String>{
    private SimpleRead parent;
    public static contents_of_afile content = new contents_of_afile();
    public static browse11 browse = new browse11();
    static byte[] dataVector = new byte[10000];
   
    write(SimpleRead read){
        this.parent = read;
    }

    @Override
    protected String doInBackground() throws Exception {
        String sfile = browse.onBrowseSwing();//gets the method that returns the file name
        if(sfile == null){
              System.out.println("sfile er null");
        }
        File file = new File(sfile);//get the file to be sent... this is actually supposed to be from browse
        if(file == null){
              System.out.println("file er null");
        }

        try{
            dataVector = contents_of_afile.getBytesFromFile(file);//the file is loaded in the dataVector
        } catch(IOException e){
           
        }
        try{
            int len = dataVector.length;

            for(int i = 0; i < len; i++ ) {
                byte sent_byte = dataVector[i];
                  if(dataVector[i] == 0x0D && dataVector[i+1] == 0x0A){
                      try{
                          Thread.sleep(190);
                        }
                        catch(InterruptedException e){
                        }
                        if(dataVector == null){
                              System.out.println("dataVector er null");
                        }
                  }else{
                      parent.outputStream.write(sent_byte);
                        }
                           
        }
     
        }catch(IOException e){
           
        }
        return null;
    }
   
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester