swing, wątki...

0

witam,
mam następujący problem: mam aplikację swingową, jednym z elementów jest ProcessFrame dziedzicząca po JFrame z zawarta JTextArea. Mam też klasę LoadToolCore, w której wywołuje sobie jakąś operację zwenętrzną:

Process p = Runtime.getRuntime().exec(path);

która wyrzuca jakieśtam komunikaty, przechwytuje je sobie :

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

wyświetlam je później w mojej ww textArea
wszystko fajnie, ale komunikaty wyświetlają się dopiero po zakończeniu wszystkich operacji (jest ich kilkadziesiąt, więc trochę to trwa), a chciałbym aby po skończeniu pojedynczej operacji wyświetlił się komunikat o każdej z nich, wiem że trzeba to na wątkach zrobić, ale pojęcia nie mam jak...

z góry dziękuję za konstruktywną pomoc

0

Mozna by zaczac od slowka synchronized i tego artykulu ale w sumie nie przyczytalem go do konca wiec nie wiem czy o to chodzi:)

http://java.sun.com/developer/technicalArticles/Threads/swing/

0
  1. Problem nie ma nic wspólnego ze Swingiem
  2. Nic tu nie da "synchronized". Nie da się tak zsynchronizować z zewnętrznym procesem. Co więcej może on być napisany, np. w C++.

Problem jest dosyć prosty do rozwiązania.
Tworzysz sobie wątek, który wykonuje w pętli read() lub readLine() na twoim buforze.
Operacje te(a na pewno read()) są blokujące. Twój wątek będzie automatycznie budzony, gdy zewnętrzny program coś wpisze do bufora.

0

chyba jestem jakis ułomny, bo nie moge cos tego ogarnąć
ogólnie metoda wygląda tak:

public void loadFiles() {
public class LoaderToolCore {
.....

		String path = "";
		String line;
		try {
			for (int i = 0; i < listOfFiles.size(); i++) {
				FileToLoad file = (FileToLoad) listOfFiles.get(i);
				path = pathToWindchill
						+ "\\bin\\windchill wt.load.LoadFromFile -d "
						+ file.getFile().getAbsoluteFile() + " -CONT_PATH /";
				p = Runtime.getRuntime().exec(path);
				BufferedReader input = new BufferedReader(
						new InputStreamReader(p.getInputStream()));
				while ((line = input.readLine()) != null) {
					getProcessFrame().getLogArea().append(line + "\n");
				}
				input.close();
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
....
}

getProcessFrame().getLogArea()
pobiera referencję klasy z textarea, samą textare i dopisuje do niej to co powinien...

czy nowy thread ma być klasą anonimowa wewnatrz tej metody, czy cała klasa ma dziedziczyć po thread??

0

ok, już działa, temat do zamknięcia

całą klasę LoaderToolCore zrobiłem extends Thread + lokalna referencja do 'odległej' JTextArea i jest OK

0

Czyli co? Aplikacja byla uruchamiana jakby tym samym procesie??

0

nie, robiłem anonimowa klasę Runnable... i jakoś nie chciało banglać, może niewłaściwie to robiłem, nieważne, tak czy siak już działa...

1 użytkowników online, w tym zalogowanych: 0, gości: 1