Archief - [PROG][JAVA] threads

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

yannick

Legacy Member
Goedemiddag,

Voor mijn project ckeck ik met een timer (om de 2 seconden) of er een nog een connectie is met de database.
Het probleem is, als er geen connectie is en hij blijft dit checken (dit doe ik voor automatische reconnect) gaat de rest van mij prog echt heel traag (omda hij steeds wacht op de timeout van de Connection).

Mijn vraag dus, kan ik dit oplossen met een thread en zoja, kunnen jullie mij op weg helpen.

Code:
private void timertick(ActionEvent e){
...
        if(timertick==2){
            if(connected){
                try{
                    controller.getConnectieGemaakt(sqlport);
                    connected(true);
                }catch(Exception ex){
                    if(connected==true){
                        JOptionPane.showMessageDialog(this,"Verbinding met de database verloren");
                        this.lblusercheck.setText("");
                        connected(false);
                    }
                }
            }else{
                try{
                    controller=new BowlingController(false,res);
                    this.connected(true);
                    this.lblusercheck.setText("");
                    JOptionPane.showMessageDialog(this,"Verbindig terug in orde");
                }catch(SQLException ex){
                    //niets doen
                }
            }
            timertick=0;
        }
        timertick++;
    }

Allesinds bedankt
mvg

Yannick

Da Turtle

Legacy Member
Dit is waarvoor een thread heel handig is. Je kan een thread maken door een nieuwe klasse te maken en deze te laten overerven van de klasse Thread. In deze klasse kan je een "run" methode maken. Deze methode is een beetje zoals de main methode.

snel wat code:
Code:
class ConnectieCheck extends Thread {
	public ConnectieCheck() {
	}

	public void run() {
		while(true) {
			// check database connectie

			// Een halve seconde wachten
			System.Thread.Sleep(500);
		}
	}
}
Daarna de thread aanmaken door de "start" (let op! niet run, anders maak je geen nieuwe thread aan.) methode op te roepen van uw klasse.
Code:
ConnectieCheck cc = new ConnectieCheck();
cc.start();

Een thread kan in principe maar gestopt worden als de run methode aan het einde komt, dus als je wilt dat hij stopt met controleren om een of andere reden, of dat de thread stopt, zul je moeten een andere voorwaarde dan (true) opgeven bij de while lus (bv een boolean variabele).ù

// edit: Er zouden eventueel wat fouten in kunnen staan, kben snel aan 't antwoorden ('k zit in de les).

yannick

Legacy Member
JA sry, had het al gevonden :D.

Dit is mij code
Code:
    public void run() {
        while (ok) {
            System.out.println(ok);
            String[] test=res[0].split("=");
            int sqlport=Integer.valueOf(test[1]).intValue();
            if(connected){
                try{
                    controller.getConnectieGemaakt(sqlport);
                    connected(true);
                }catch(Exception ex){
                    if(connected==true){
                        JOptionPane.showMessageDialog(this,"Verbinding met de database verloren");
                        this.lblusercheck.setText("");
                        connected(false);
                    }
                }
            }else{
                try{
                    controller=new BowlingController(false,res);
                    this.connected(true);
                    this.lblusercheck.setText("");
                    JOptionPane.showMessageDialog(this,"Verbindig terug in orde");
                }catch(SQLException ex){
                    //niets doen
                }
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {

            }
        }
    }

Ik gebruik dus geen aparte klasse, dit is handiger bij mijn code :).
Maar ik ben nu aant zoeken naar een manier om de thread te stoppen zonder .stop() te gebruiken :).

Bedankt voor de hulp allesinds ^^

*EDIT*
Ok problemen, al mijn functies en variabelen in die run() worden niet gezien in mijn gui (buiten de Thread dus). Ik heb die nodig om de labels te updaten om te laten zien dat je disconnected bent :(.

Iemand een plan?

mvg

yannick

Legacy Member
Ok, nu moet ik dus dit doen om alles werkend te krijgen

Code:
public BowlingGui(String[] res) {
        super.setTitle("BBSF-SFBB");
        this.res=res;        
        initComponents();
        initVariables();
        makeconnection();
        th1=(new Thread(new BowlingGui(res,th1, controller, connected,this.lblusercheck,this.lblConnectie,this.btwLogin,this.txtusername,this.txtpassword)));
        th1.start();
    }
    public BowlingGui(String[] res,Thread th1, BowlingController controller,Boolean connected,JLabel lblusercheck,JLabel Connectie,JButton go,JTextField user,JPasswordField pass){
        this.controller=controller;
        this.connected=connected;
        this.lblusercheck=lblusercheck;
        this.lblConnectie=Connectie;
        this.btwLogin=go;
        this.btwLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btwLoginActionPerformed(evt);
            }
        });
        this.txtpassword=pass;
        this.txtusername=user;
        this.res=res;
    }

Is er geen andere manier dan dit :s.

mvg

Rajiv

Legacy Member
Wat ik zou doen is zoals hierboven al eens gezeg is.

Een aparte klasse met je Thread aanmaken, daarin dan wat statusvariabelen.
Dan vanuit een andere klasse dia variabelen ophalen of je Thread de tekst op je JLabels laten instellen.

yannick

Legacy Member
Mja, ma ik denk dat da moeilijk is in mijn geval. Want dan heb ik een aparte klasse die om de 5 sec gaat checken of de database nog bereikbaar is en die dan variabelen gaat vullen, maar dan heb ik in mijn gewone klasse nog altijd ne timer nodig om die variabelen op te vragen...?

Of hoe zien jullie het?

Ik heb een paar functies en lbls die ik moet aanspreken in mijn GUI klasse. met dat stuk code dat in de thread zit.

mvg

QplQyer

Legacy Member
Code:
public class DatabaseChecker implements Runnable {
         // Velden
         JLabel label;
         JFrame frame;
         bool false;  // of is dat boolean in java, ff vergeten
         
         public DatabaseChecker (JLabel label, JFrame frame) {
                  this.label = label;
                  this.frame = frame;
                  offline = false;
         }

         public void run () {
                 while (!offline) {
                     if (verbinding nog online controle) {
                        // doe stuff
                     } else {
                        JOptionPane.showDialog(frame,...,"Oepsie");
                        label.setText ("");
                        // Of: label.repaint() of:
                        frame.getContentPane().repaint();
                     }
           }

           // Dat kan wel met een setter ofzo ook
           public void killMe () {
                    offline = true;
           }
}
In de andere klasse doe je dan:
Code:
Thread t = new Thread(new DatabaseChecker(parameters));
t.start();
.
.
.
einde programma: t.killMe();

Werkt dat (eventueel zonder repaint, het zou kunnen dat setText reeds doet repainten)?

Trouwens, steek die Thread echt in een andere klasse, dat is properder qua design. Daarenboven zou het mij niet verbazen mochten je problemen eruit voortvloeien. Swing draait namelijk reeds zelf in zijn eigen thread, de EventDispatcherThread. Wanneer je nu zelf een Component aanmaakt die een eigen thread zal opstarten zal daar allicht het één en ander mislopen waardoor je niks meer te zien krijgt.

Maak er desnoods een private binnenklasse van.

yannick

Legacy Member
QplQyer zei:
Code:
public class DatabaseChecker implements Runnable {
         // Velden
         JLabel label;
         JFrame frame;
         bool false;  // of is dat boolean in java, ff vergeten
         
         public DatabaseChecker (JLabel label, JFrame frame) {
                  this.label = label;
                  this.frame = frame;
                  offline = false;
         }

         public void run () {
                 while (!offline) {
                     if (verbinding nog online controle) {
                        // doe stuff
                     } else {
                        JOptionPane.showDialog(frame,...,"Oepsie");
                        label.setText ("");
                        // Of: label.repaint() of:
                        frame.getContentPane().repaint();
                     }
           }

           // Dat kan wel met een setter ofzo ook
           public void killMe () {
                    offline = true;
           }
}
In de andere klasse doe je dan:
Code:
Thread t = new Thread(new DatabaseChecker(parameters));
t.start();
.
.
.
einde programma: t.killMe();

Werkt dat (eventueel zonder repaint, het zou kunnen dat setText reeds doet repainten)?

Trouwens, steek die Thread echt in een andere klasse, dat is properder qua design. Daarenboven zou het mij niet verbazen mochten je problemen eruit voortvloeien. Swing draait namelijk reeds zelf in zijn eigen thread, de EventDispatcherThread. Wanneer je nu zelf een Component aanmaakt die een eigen thread zal opstarten zal daar allicht het één en ander mislopen waardoor je niks meer te zien krijgt.

Maak er desnoods een private binnenklasse van.

Merci, das idd een heel goede manier, dat ik er zelf niet opgekomen ben :( ( als ge zo heel den dag bezig zijt met java ziede soms de bomen door het bos nimeer :p). Op dat idee om de threads te stoppen was ik al opgekomen, maar jmr gng werkte dit niet omdat ik de thread binnen de klasse heb gemaakt. Ik zal onmiddellijk uw idee eens uitproberen, eens kijken of het werkt :).

Bedankt! :)

mvg
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan