Zum Inhalt springen

SWT GUI for Serial Communication - ProgressBar friet ein, wenn Focus lost


Empfohlene Beiträge

Geschrieben

Hi!

Ich schreibe gerade ein SWT Programm, welches über RXTX mit einem Microcontroller kommuniziert. Die GUI öffnet dafür einen neuen Thread für die Serielle Kommunikation. Während dem Datenaustausch wird eine ProgressBar angezeigt und aktualisiert. Alles funktioniert auch so weit. Außer man andert den Window Focus (öffent beispielsweise der Internet Browser während der Datenübertragen). Wenn man dann zurück zur GUI kehrt, ist sie eingefrohren, bis der Datenaustausch feritg ist.

Also Code zum seriellen Datenübertragung habe ich den von Kuligowski's Tutorial verwendet (worldwideweb dot kuligowski dot pl). Seine RS232Example Class habe ich um eine Progressbar erweitert (und in SerialCommunication um benannt):

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.widgets.MessageBox;

import org.eclipse.swt.widgets.ProgressBar;

import org.eclipse.swt.widgets.Shell;

import gnu.io.CommPortIdentifier;

import gnu.io.NoSuchPortException;

import gnu.io.PortInUseException;

import gnu.io.SerialPort;

import gnu.io.UnsupportedCommOperationException;

public class SerialCommunication {

protected CommPortIdentifier portIdentifier;

protected SerialPort serialPort;

public OutputStream outStream;

protected InputStream inStream;

private static CommPortReceiver receiver;

private static MessageInterpreter interpreter;

private static String comport;

private static Shell parent_shell;

private Label label;

private ProgressBar progress;

public enum Processing {

PROCESS_BAR, TIMEOUT

}

SerialCommunication(String c, Shell s)

{

interpreter = new MessageInterpreter();

comport = c;

parent_shell = s;

}

public boolean connect(String portName, Processing p) throws Exception {

portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

// points who owns the port and connection timeout

try{

serialPort = (SerialPort) portIdentifier.open("Testapplication", 2000);

// setup connection parameters

serialPort.setSerialPortParams(230400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

// setup serial port writer

CommPortSender.setWriterStream(serialPort.getOutputStream());

// setup serial port reader

receiver = new CommPortReceiver(serialPort.getInputStream(), interpreter);

receiver.start();

if(p.name().equals("TIMEOUT"))

{

TimeOutThread timeout = new TimeOutThread(receiver);

timeout.start();

System.err.println("Timeout Thread started...");

}

return true;

}catch(PortInUseException e){

MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR);

msg.setText("Error");

msg.setMessage("Port already in use... \n");

msg.open();

return false;

}

}

public void disconnect() {

if (serialPort != null) {

try {

// close the i/o streams.

serialPort.getInputStream().close();

serialPort.getOutputStream().close();

} catch (IOException ex) {

// don't care

}

serialPort.close();

serialPort = null;

}

}

public void DataTransfer(String s) throws Exception

{

Shell shell = new Shell(parent_shell, SWT.TITLE | SWT.PRIMARY_MODAL);

shell.setText("Processing");

shell.setSize(400, 90);

Rectangle splashRect = shell.getBounds();

Rectangle displayRect = parent_shell.getDisplay().getBounds();

final int x = (displayRect.width - splashRect.width) / 2;

final int y = (displayRect.height - splashRect.height) / 2;

shell.setLocation(x, y);

label = new Label(shell, SWT.LEFT);

label.setText("Checking connectivity...");

label.setBounds(12,10,370,20);

progress = new ProgressBar(shell, SWT.HORIZONTAL | SWT.SMOOTH);

progress.setBounds(10,30,370,20);

shell.open();

try

{

boolean connected = this.connect(comport, Processing.TIMEOUT);

if(connected == true)

{

interpreter.setConnection(false);

CommPortSender.send(new ProtocolImpl(interpreter).getMessage("A"));

while(receiver.isAlive())

{}

this.disconnect();

System.err.println("Starting Datatransfer = " + interpreter.getConnection());

if(interpreter.getConnection() == true)

{

label.setText("Transfering data...");

progress.setMinimum(0);

progress.setMaximum(interpreter.getMax_address());

this.connect(comport, Processing.PROCESS_BAR);

CommPortSender.send(new ProtocolImpl(interpreter).getMessage("E"));

while(receiver.isAlive())

{

progress.setSelection(interpreter.getAddress());

}

this.disconnect();

interpreter.moveDumpFile(s);

if(interpreter.getError() == false)

{

MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_INFORMATION);

msg.setText("Information");

msg.setMessage("Data transfered successfully ... \n");

msg.open();

}

else

{

MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR);

msg.setText("Error");

msg.setMessage("Error during data transfer, please try again ... \n");

msg.open();

}

}

else

{

MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR);

msg.setText("Error");

msg.setMessage("Timeout... Check Serial Interface \n");

msg.open();

}

}

}

catch(Exception e)

{

e.printStackTrace();

}

shell.close();

}

}

DataTransfer() wird durch drücken eines Bottons in der GUI aufgerufen. Innerhalb DataTransfer wird ein Thread zur seriellen Kommunikation erstellt. Innerhalb einem while loop frage ich ab, ob dieser Thread nch existiert. Wenn ja, dann update ich die Progress Bar.

Alles geht super. Außer man ändert den Window Focus (öffnet beispielsweise der Internet Browser während der Datenübertragen). Wenn man dann zurück zur GUI kehrt, ist sie eingefrohren, bis der Datenaustausch feritg ist.

Was könnte das Problem sein?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...