Problem mit runtime und Buttons unter Windows

DOcean

Grünschnabel
Hallo,

nachdem mein SWT Problem hier gut gelöst wurde hoffe ich auch jetzt auf Antworten...

Ich hab eine Klasse die das Programm (konsolen tool) aufruft. Diese Klasse bzw. die Methoden werden wiederum von einer VC aufgerufen (per Button).

Unter linux gehts prima.

Unter Windows bleibt der Button gedrückt bis zur Ewigkeit...(anscheinend kommt der Aufruf nicht zurück)

Hier mal der code der avrdude.java
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;


public class avrdude {
	private String avr;
	private String promer;
	private String datei;
	private String port;
	private String memtype;
	private char operation;
	private char format;
	private String aktion;
	private String os;
	
	public avrdude() {
		avr="";
		promer="";
		datei="";
		port="";
		memtype="";
		operation=' ';
		aktion="";
		format='i';
		
		os= System.getProperty("os.name").toLowerCase();
		}
	
	public String execute() {
		Process proc=null;
		baueaktion();
		String ausgabe=aktion;
		
		try {
			if(os.startsWith("windows"))
				proc = Runtime.getRuntime().exec("cmd /u /c "+aktion);
			else if (os.startsWith("linux"))
				proc = Runtime.getRuntime().exec(aktion);
			
			BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
			BufferedReader error = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			
			String zeile;
			while ((zeile = input.readLine()) != null) {
				ausgabe+=("\n"+zeile);
			}
			while ((zeile = error.readLine()) != null) {
				ausgabe+=("\n"+zeile);
			}
			
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return ausgabe;
	}
	
	public String execute(String argument) {
		Process proc=null;
		
		String aktion2="avrdude "+argument;
		String ausgabe=aktion2;
		
		try {
			if(os.startsWith("windows"))
				proc = Runtime.getRuntime().exec("cmd /u /c "+aktion2);
			else if (os.startsWith("linux"))
				proc = Runtime.getRuntime().exec(aktion2);
			
			BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
			BufferedReader error = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			
			String zeile;
			while ((zeile = input.readLine()) != null) {
				ausgabe+=("\n"+zeile);
			}
			while ((zeile = error.readLine()) != null) {
				ausgabe+=("\n"+zeile);
			}
			
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return ausgabe;
	}
	
	public String[] getpromerliste() {
		Process proc=null;
		String[] sliste=null;
		
		try {
			if(os.startsWith("windows"))
				proc = Runtime.getRuntime().exec("cmd /u /c avrdude -c -?");
			else if (os.startsWith("linux"))
				proc = Runtime.getRuntime().exec("avrdude -c -?");
						
			BufferedReader input = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			Vector liste = new Vector();
			
			String zeile;
			int i=0,j=0;
			
			while (((zeile=input.readLine()) != null)) {
				i++;
				if(i>4 && zeile.length()>15) {
					j=zeile.indexOf(' ', 5);
					zeile=zeile.substring(2, j);
					liste.add(zeile);
				}
			}
			
			sliste = new String[liste.size()];
			for (i=0;i<liste.size();i++) {
				sliste[i]=(String)liste.elementAt(i);
			}
						
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return sliste;
	}
	
	public String[] getavrliste() {
		Process proc=null;
		String[] sliste=null;
			
		try {
			if(os.startsWith("windows"))
				proc = Runtime.getRuntime().exec("cmd /u /c avrdude -p a -c "+promer);
			else if (os.startsWith("linux"))
				proc = Runtime.getRuntime().exec("avrdude -p a -c "+promer);
			
			proc = Runtime.getRuntime().exec("avrdude -p a -c "+promer);
			BufferedReader input = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			Vector liste = new Vector();
				
			String zeile;
			int i=0,j=0;
			
			while (((zeile=input.readLine()) != null)) {
				i++;
				if(i>4 && zeile.length()>15) {
					j=zeile.indexOf(' ', 12);
					zeile=zeile.substring(2, j);
					liste.add(zeile);
				}
			}
				
			sliste = new String[liste.size()];
			for (i=0;i<liste.size();i++) {
				sliste[i]=(String)liste.elementAt(i);
			}
							
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return sliste;
	}
	
	public void setAvr(String avr) {
		this.avr = avr;
		baueaktion();
	}
	public void setDatei(String datei) {
		this.datei = datei;
		baueaktion();
	}
	public void setPromer(String promer) {
		this.promer = promer;
		baueaktion();
	}

	public void setMemtype(String memtype) {
		this.memtype = memtype;
		baueaktion();
	}

	public void setOperation(char operation) {
		this.operation = operation;
		baueaktion();
	}

	public void setPort(String port) {
		this.port = port;
		baueaktion();
	}

	public String getAktion() {
		baueaktion();
		return aktion;
	}
	
	private void baueaktion() {
		aktion="avrdude -c "+promer+" -p "+avr+" -P "+port+
						" -U "+memtype+":"+operation+":"+datei
						+":"+format;
	}


	
}

und hier de VC burnAVRburn.java
Code:
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Group;

public class burnAVRburn {

	private Shell sShell = null;  //  @jve:decl-index=0:visual-constraint="10,10"
	private TabFolder tabFolder = null;
	private Composite composite = null;
	private Composite composite1 = null;
	private Composite composite2 = null;
	private Text hexdatei = null;
	private Button button_hex_l = null;
	private Text eppdatei = null;
	private Button button_epp_l = null;
	private Button button_hex_s = null;
	private Button button_epp_s = null;
	private Label label = null;
	private Label label1 = null;
	private Label label2 = null;
	private Group group = null;
	private Label label3 = null;
	private Combo avr = null;
	private Group group1 = null;
	private Label label4 = null;
	private Combo promer = null;
	private Text port = null;
	private Label label5 = null;
	private Label aufruf = null;
	static private avrdude prog1;
	private Text konsole = null;
	private Button button_hex_v = null;
	private Button button_epp_v = null;
	/**
	 * This method initializes tabFolder	
	 *
	 */
	private void createTabFolder() {
		GridData gridData = new GridData();
		gridData.widthHint = -1;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.CENTER;
		gridData.heightHint = 200;
		tabFolder = new TabFolder(sShell, SWT.NONE);
		tabFolder.setLayoutData(gridData);
		createComposite();
		createComposite1();
		createComposite2();
		TabItem tabItem = new TabItem(tabFolder, SWT.NONE);
		tabItem.setControl(composite);
		tabItem.setText("Programm");
		TabItem tabItem1 = new TabItem(tabFolder, SWT.NONE);
		tabItem1.setControl(composite1);
		tabItem1.setText("Fuses");
		TabItem tabItem2 = new TabItem(tabFolder, SWT.NONE);
		tabItem2.setControl(composite2);
		tabItem2.setText("Infos");
	}

	/**
	 * This method initializes composite	
	 *
	 */
	private void createComposite() {
		GridData gridData5 = new GridData();
		gridData5.horizontalAlignment = GridData.FILL;
		gridData5.grabExcessHorizontalSpace = true;
		gridData5.verticalAlignment = GridData.CENTER;
		GridData gridData4 = new GridData();
		gridData4.horizontalAlignment = GridData.FILL;
		gridData4.grabExcessHorizontalSpace = true;
		gridData4.verticalAlignment = GridData.CENTER;
		GridLayout gridLayout1 = new GridLayout();
		gridLayout1.numColumns = 4;
		gridLayout1.makeColumnsEqualWidth = false;
		composite = new Composite(tabFolder, SWT.NONE);
		composite.setLayout(gridLayout1);
		label = new Label(composite, SWT.NONE);
		label.setText("Datei für Flash");
		Label filler2 = new Label(composite, SWT.NONE);
		Label filler1 = new Label(composite, SWT.NONE);
		Label filler6 = new Label(composite, SWT.NONE);
		hexdatei = new Text(composite, SWT.BORDER);
		hexdatei.setLayoutData(gridData4);
		button_hex_l = new Button(composite, SWT.NONE);
		button_hex_l.setText("lesen");
		button_hex_l
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(hexdatei.getText());
						prog1.setOperation('r');
						prog1.setMemtype("flash");
						konsole.setText(prog1.execute());
					}
				});
		button_hex_s = new Button(composite, SWT.NONE);
		button_hex_s.setText("schreiben");
		button_hex_s
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(hexdatei.getText());
						prog1.setOperation('w');
						prog1.setMemtype("flash");
						konsole.setText(prog1.execute());					}
				});
		button_hex_v = new Button(composite, SWT.NONE);
		button_hex_v.setText("überprüfen");
		button_hex_v
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(hexdatei.getText());
						prog1.setOperation('v');
						prog1.setMemtype("flash");
						konsole.setText(prog1.execute());					}
				});
		label1 = new Label(composite, SWT.NONE);
		label1.setText("Datei fürs EEPROM");
		Label filler4 = new Label(composite, SWT.NONE);
		Label filler3 = new Label(composite, SWT.NONE);
		Label filler5 = new Label(composite, SWT.NONE);
		eppdatei = new Text(composite, SWT.BORDER);
		eppdatei.setLayoutData(gridData5);
		button_epp_l = new Button(composite, SWT.NONE);
		button_epp_l.setText("lesen");
		button_epp_l
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(eppdatei.getText());
						prog1.setOperation('r');
						prog1.setMemtype("eeprom");
						konsole.setText(prog1.execute());					}
				});
		button_epp_s = new Button(composite, SWT.NONE);
		button_epp_s.setText("schreiben");
		button_epp_s
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(eppdatei.getText());
						prog1.setOperation('w');
						prog1.setMemtype("eeprom");
						konsole.setText(prog1.execute());					}
				});
		button_epp_v = new Button(composite, SWT.NONE);
		button_epp_v.setText("überprüfen");
		button_epp_v
				.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
					public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						prog1.setDatei(eppdatei.getText());
						prog1.setOperation('v');
						prog1.setMemtype("eeprom");
						konsole.setText(prog1.execute());					}
				});
	}

	/**
	 * This method initializes composite1	
	 *
	 */
	private void createComposite1() {
		GridLayout gridLayout2 = new GridLayout();
		gridLayout2.makeColumnsEqualWidth = false;
		GridData gridData2 = new GridData();
		gridData2.horizontalAlignment = GridData.FILL;
		gridData2.verticalAlignment = GridData.BEGINNING;
		composite1 = new Composite(tabFolder, SWT.NONE);
		composite1.setLayout(gridLayout2);
		label2 = new Label(composite1, SWT.NONE);
		label2.setText("todo");
		label2.setLayoutData(gridData2);
	}

	/**
	 * This method initializes composite2	
	 *
	 */
	private void createComposite2() {
		composite2 = new Composite(tabFolder, SWT.NONE);
		composite2.setLayout(new GridLayout());
	}

	/**
	 * This method initializes group	
	 *
	 */
	private void createGroup() {
		GridData gridData7 = new GridData();
		gridData7.horizontalAlignment = GridData.FILL;
		gridData7.verticalAlignment = GridData.CENTER;
		GridLayout gridLayout3 = new GridLayout();
		gridLayout3.numColumns = 2;
		group = new Group(sShell, SWT.NONE);
		group.setLayout(gridLayout3);
		group.setLayoutData(gridData7);
		label3 = new Label(group, SWT.NONE);
		label3.setText("AVR:");
		createAvr();
	}

	/**
	 * This method initializes avr	
	 *
	 */
	private void createAvr() {
		GridData gridData8 = new GridData();
		gridData8.horizontalAlignment = GridData.BEGINNING;
		gridData8.grabExcessHorizontalSpace = true;
		gridData8.verticalAlignment = GridData.CENTER;
		avr = new Combo(group, SWT.NONE);
		avr.setText("CPU auswählen                ");
		avr.setLayoutData(gridData8);
		avr.addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				String temp=avr.getItem(avr.getSelectionIndex());
				prog1.setAvr(temp.substring(0,temp.indexOf(' ')));

				temp=prog1.getAktion();
				int i=temp.indexOf('U');
				temp=temp.substring(0, i-1);
				aufruf.setText(temp);
			}
			public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
			}
		});
	}

	/**
	 * This method initializes group1	
	 *
	 */
	private void createGroup1() {
		GridData gridData9 = new GridData();
		gridData9.grabExcessHorizontalSpace = false;
		gridData9.widthHint = 100;
		GridData gridData6 = new GridData();
		gridData6.horizontalAlignment = GridData.FILL;
		gridData6.verticalAlignment = GridData.CENTER;
		GridLayout gridLayout4 = new GridLayout();
		gridLayout4.numColumns = 4;
		group1 = new Group(sShell, SWT.NONE);
		group1.setLayout(gridLayout4);
		group1.setLayoutData(gridData6);
		label4 = new Label(group1, SWT.NONE);
		label4.setText("Programmierer:");
		createPromer();
		label5 = new Label(group1, SWT.NONE);
		label5.setText("an Port:");
		port = new Text(group1, SWT.BORDER);
		port.setText("Anschluß");
		port.setLayoutData(gridData9);
		port.addModifyListener(new org.eclipse.swt.events.ModifyListener() {
			public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
				prog1.setPort(port.getText());

				String temp=prog1.getAktion();
				int i=temp.indexOf('U');
				temp=temp.substring(0, i-1);
				aufruf.setText(temp);
			}
		});
	}

	/**
	 * This method initializes promer	
	 *
	 */
	private void createPromer() {
		GridData gridData10 = new GridData();
		gridData10.grabExcessHorizontalSpace = true;
		promer = new Combo(group1, SWT.NONE);
		promer.setItems(prog1.getpromerliste());
		promer.setLayoutData(gridData10);
		promer.addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
				prog1.setPromer(promer.getItem(promer.getSelectionIndex()));
				avr.setItems(prog1.getavrliste());
				
				String temp=prog1.getAktion();
				int i=temp.indexOf('U');
				temp=temp.substring(0, i-1);
				aufruf.setText(temp);
				}
			public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
			}
		});
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
		 * for the correct SWT library path in order to run with the SWT dlls. 
		 * The dlls are located in the SWT plugin jar.  
		 * For example, on Windows the Eclipse SWT 3.1 plugin jar is:
		 *       installation_directory\plugins\org.eclipse.swt.win32_3.1.0.jar
		 */
		Display display = Display.getDefault();
		burnAVRburn thisClass = new burnAVRburn();
		
		prog1 = new avrdude();
				
		thisClass.createSShell();
		thisClass.sShell.open();
		
		while (!thisClass.sShell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	/**
	 * This method initializes sShell
	 */
	private void createSShell() {
		GridData gridData1 = new GridData();
		gridData1.heightHint = 200;
		gridData1.horizontalAlignment = GridData.FILL;
		gridData1.verticalAlignment = GridData.CENTER;
		gridData1.widthHint = -1;
		GridData gridData12 = new GridData();
		gridData12.grabExcessHorizontalSpace = false;
		gridData12.verticalAlignment = GridData.CENTER;
		gridData12.horizontalAlignment = GridData.FILL;
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 1;
		sShell = new Shell();
		sShell.setText("Burn AVR Burn");
		createTabFolder();
		sShell.setLayout(gridLayout);
		createGroup();
		createGroup1();
		aufruf = new Label(sShell, SWT.NONE);
		aufruf.setText("noch nichts gewählt ");
		aufruf.setLayoutData(gridData12);
		konsole = new Text(sShell, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
		konsole.setLayoutData(gridData1);
		sShell.setSize(new Point(500, 650));
	}

}

Was ist da im argen? Der befehl wird anscheindend ausgeführt weil eine Datei mit passender Grösse entsteht. Das Aufrufen geht auch gut wenns ohne Button passiert. (zu Anfang wird die Methode getpromerliste() (genauso wie getavrliste() )aufgerufen die gehen.
 
hab jetzt mal probiert die Klasse processBuilder zu nutzen nur beim Eintippen vom Code
Code:
proc =new ProcessBuilder("ls").start();

sagt Eclipse "Der Konstruktor ProcessBuilder(String) ist nicht definiert (undefined)"

hab oben import java.io.*; stehen...

und nun?
 
Das mit dem ProcessBuilder geht jetzt...

build = new ProcessBuilder(new String[] {"prog","argument"});

so muss das heissen....

bzw.

proc = new ProcessBuilder(new String[] {"",""}).start();

Nur wie kann ich jetzt aus meinem String mit lauter Argumenten einen String[] machen indem dannn die Argumente drin stehen?

EDIT:
da geht mit split(" ");
 
Zuletzt bearbeitet:
Zurück