SWT i wątki

0

Mam pewien problem. Pisze programik i chciałbm w nim odpalać wątki. Problem jest w tym, że po odpaleniu wątku już nic nie idzie zrobić w programie dopóki wątek nie zakończy swojego działania. A ja chciałbym aby to się wykonywało (może i zajmować 100% procesora) ale żebym mógł kliknąć jakieś opcje w programie np. zatrzymaj wątek. Wszystko pisze w SWT. Poniżej wkleję najważniejsze punkty mojego programu (przynajmniej tak mi się wydaje)

Programik...

public class ServerMain {        
        public static Thread chatThread;
	public final static ChatServer chatRun = new ChatServer(1);
	public static int licznik;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		licznik = 1;
	
		ServerMain frmMain = new ServerMain();
		frmMain.Interfejs();
		frmMain.Open();
		
		while (!frmWindow.isDisposed()){
			if (!display.readAndDispatch()){
				display.sleep();
			}
		}
		display.dispose();
	}

}

Odpalenie wątku...

chatThread = new Thread(chatRun){
	public void run(){
	display.syncExec(chatRun);
	}
};
				
chatThread.start();

No i sam wątek..

public class ChatServer implements Runnable {

	
public void run() {

int i;
i=1;
	

while (i<10000) {

	i++;
	for (int y=0; y<999999;y++){
	int z = (int)65675-5*5;
	}
}
		
}

}

Co do tego co ma robić wątek proszę nie zwracam uwagi, po prostu robie test, tak aby zajmował procesor</cpp>

0

Poczytaj lepiej dokumentację display.syncExec(), to się dowiesz, czemu tak się dzieje.
syncExec służy do wykonywania krótkich kawałków kodu, które mieszają coś w GUI, ale muszą być
wywołane z osobnego wątku. syncExec zabezpiecza przed równoczesnym mieszaniem w GUI przez 2 wątki. Stąd jak Twój wątek miesza w GUI (wywołał syncExec i uparcie w nim tkwi), to w tym czasie inny (user) do GUI dostępu nie ma. W Twoim przypadku syncExec jest niepotrzebne.

Poza tym w jakiś dziwny sposób odpalasz ten wątek - kilka minut mi zajęło zanim rozczaiłem, że jest dobrze.
Po cholerę Ci przeciążać Thread.run() ORAZ robić własną klasę implementującą Runnable? Zwykle robi się ALBO jedno ALBO drugie.

0

Dzięki, miałeś racje, teraz wszystko działa.

Teraz krótkie wytłumaczenie, uczę sie w Javie i dlatego strzelam takie byki. Dlaczego przeciążyłem Thread.run() i klase Runnable - ponieważ nie chciało mi działać więc kombinowałem, sprawdzałem przykłady z książek i chyba to wszystko za daleko zaszło i się zgubiłem.

Ważne, że teraz działa, jeszcze raz dzięki.

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