Avatar billede huutt Nybegynder
27. september 2010 - 11:47 Der er 6 kommentarer og
1 løsning

DoEvent i java

Goddag eksperter jeg sidde lige og leger med lidt java og er løbet ind i et problem jeg har en loop der fryser det hele og håber på at man kan lave et kald som i Visual Basic som DoEvent der giver alt andet kode lov til at køre indimellem.

her er koden der fryser i grove træk.

boolean _run = true;
while (_run) {
  ... ...
}

mvh Huutt.
Avatar billede danco Nybegynder
27. september 2010 - 12:00 #1
Hejsa,
Jeg forstår godt at dit program "fryser" din while løkke kører konstant også selvom den har udført al koden.

Hvad du kan gøre at at du kan oprette et par tråde, på den måde kan du kører flere processer samtidig uden at programmet fryser.
Avatar billede huutt Nybegynder
27. september 2010 - 12:13 #2
spørger jeg dumt når jeg siger hvad mener du enligt helt præcist med tråde ?
Avatar billede danco Nybegynder
27. september 2010 - 12:44 #3
En tråd i java er en proces der kan kører for sig selv, så beregninger osv kan overlappe hinanden uden at sløve.

Hus h = new Hus();
Beboer b = new Beboer();

Thread th = new Thread(h);
Thread tb = new Thread(b);

du skal huske at alle dine klasser du skal køre i tråde SKAL implementerer Runnable.
Avatar billede huutt Nybegynder
27. september 2010 - 14:36 #4
ok, nu er jeg med igen. 
smid et svar
Avatar billede arne_v Ekspert
27. september 2010 - 14:40 #5
Løsningen er helt klat tråde. Der er ikke nogen god DoEvents i Java. DU kunne naturligvis prøve med:

Thread.yield();

men det er noget hø.

Eksempel med tråd:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NewDynNum extends JFrame implements ActionListener {
    private JTextField txt;
    private JButton btn;
    private int n;
    public NewDynNum() {
        n = 0;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        txt = new JTextField();
        txt.setText(Integer.toString(n));
        getContentPane().add(txt, BorderLayout.CENTER);
        btn = new JButton("Count 10 up");
        btn.addActionListener(this);
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    public void incr() {
        n++;
        txt.setText(Integer.toString(n));
    }
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == btn) {
            T t = new T(this);
            t.start();
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                NewDynNum f = new NewDynNum();
                f.setVisible(true);
            }
        });
    }
}

class T extends Thread {
    private NewDynNum dn;
    public T(NewDynNum dn) {
        this.dn = dn;
    }
    public void run() {
        for (int i = 0; i < 10; i++) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    dn.incr();
                }
            });
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}
Avatar billede danco Nybegynder
27. september 2010 - 17:58 #6
Det er et ganske udemærket eksempel arne kommer med her.

men det korte og det lange er at du skal have den while(true) i klassens run() som kommer ved implementering af Runnable.
Her er et svar.
Avatar billede huutt Nybegynder
27. september 2010 - 20:07 #7
takker for ideen arne men bonussen ryger til darco da han kom med Thread først.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester