Java - swing - threads

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Java - swing - threads

Post by semika » Mon May 30, 2005 12:59 pm

Eχω το εξής πρόβλημα.
Εχω κατασκευάσει μία διεπαφή με διάφορα κουμπάκια και μία label.
Οταν πατάς το ένα κουμπί εκτελείται μία συνάρτηση (που παίρνει πολύ χρόνο). Οσο εκτελείται θέλω να εμφανίσω στην label ενα μήνυμα "Περίμενε" και όταν εκτελεστεί να το σβήσω.
Κανω το εξής μεσα στο actionPerformed του κουμπιού:

Code: Select all

label.setText("Perimene");
xronovora_synarthsh();
label.setText("");
Ωστόσο πάλι εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.

Από ότι κατάλαβα κάτι παίζει με τα threads. Μπορεί κάποιος να με βοηθήσει??

Ευχαριστώ πάντως :smile:
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

Post by PaP » Mon May 30, 2005 1:10 pm

Το καλύτερο νομίζω που μπορείς να κάνεις είναι να κάνεις setText μέσα στη χρονοβόρα συνάρτηση στην αρχή της και πριν επιστρέψει να ξανακάνεις setText οκ.
Η αλλιώς πρέπει να έχεις διαφορετικά threads ένα για τη χρονοβόρα και ένα για το Gui αλλά θα πρέπει να τα συγχρονήσεις.
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Mon May 30, 2005 1:32 pm

Υποθέτω ότι το setLabel είναι buffered και έτσι μέχρι να τεθεί η τιμή έχει μπει μέσα στη μέθοδο. Αυτό που σου προτείνω (αυτό κάνω πάντα) είναι να βάλεις τη μέθοδο αυτή σε μια τάξη που θα τρέχει σε ξεχωριστό thread. Δε νομίζω να θες να κολάει όλη η διεπαφή όταν μπαίνει στη μέθοδο αυτή
[Better to understand a little than to misunderstand a lot]
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Mon May 30, 2005 2:16 pm

Ευχαριστώ και τους δύο
Einherjar wrote:Υποθέτω ότι το setLabel είναι buffered και έτσι μέχρι να τεθεί η τιμή έχει μπει μέσα στη μέθοδο. Αυτό που σου προτείνω (αυτό κάνω πάντα) είναι να βάλεις τη μέθοδο αυτή σε μια τάξη που θα τρέχει σε ξεχωριστό thread. Δε νομίζω να θες να κολάει όλη η διεπαφή όταν μπαίνει στη μέθοδο αυτή
Nai. αυτό είχα καταλάβει κι εγώ, αλλά δεν ξέρω πως να το βάλω σε νέο thread.
Αρκεί να κάνω την τάξη implements runnable ?
User avatar
PaP
Venus Project Founder
Venus Project Founder
Posts: 1077
Joined: Wed Apr 21, 2004 12:06 am
Academic status: Alumnus/a
Location: San Francisco
Contact:

Post by PaP » Mon May 30, 2005 2:40 pm

ΜΠορείς να κάνει κάνεις μία ταξη απλά extends Thread
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Mon May 30, 2005 3:50 pm

Ευχαριστώ πολύ! θα το προσπαθήσω και αν είναι θα ξαναποστάρω
:smile: :shock: :smile:
User avatar
AmmarkoV
Wow! Terabyte level
Wow! Terabyte level
Posts: 2838
Joined: Thu Nov 04, 2004 2:55 pm
Gender:
Location: Reloaded @ Santa Friday
Contact:

Post by AmmarkoV » Mon May 30, 2005 4:08 pm

semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
:shock:
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Ή μήπως πρέπει να ξαναζωγραφήσεις τα αντικείμενα (για να ανανεωθεί το κείμενο) Στο δικό μου gui χρειάζεται το 2ο..
Ελπίζω να βοήθησα καθόλου..
Spoiler: εμφάνιση/απόκρυψη
I would love to change the world, but they won't give me the source code. Οι καθηγητές πληρώνονται από το δημόσιο αρα από όλους τους Έλληνες για να κάνουν τα μαθήματα. Όλοι οι Έλληνες θα έπρεπε να μπορούν να δουν τα μαθήματα τα οποία πληρώνουν! Tο πνευματικό έργο που επιτελείται με τα χρήματα του δημοσίου ΔΕΝ είναι μόνο δικό σας Όποιος δεν δίνει πανελλήνιες έχει δικαίωμα στην γνώση που πληρώνει [url=http://ammar.gr/gddg]gddg blog[/url]
Image
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Mon May 30, 2005 4:44 pm

AmmarkoV wrote:
semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
:shock:
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Ή μήπως πρέπει να ξαναζωγραφήσεις τα αντικείμενα (για να ανανεωθεί το κείμενο) Στο δικό μου gui χρειάζεται το 2ο..
Ελπίζω να βοήθησα καθόλου..
Κι εγώ κουφό το βρίσκω.
Είχα βάλει label.repaint() και πάλι στο τέλος τα εκτελεί
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Mon May 30, 2005 7:18 pm

AmmarkoV wrote:
semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
:shock:
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Βασικά δεν είναι κουφό είναι optimization του paint() scheduler της Java. Εάν μέσα σε ένα block ενολών έχεις 2 ή περισσότερα repaint(μπορεί να μην είναι άμεσα αλλά έμμεσα πχ αλλάζεις ένα value σε κάποιο field οπότε γίνεται repaint) τότε εκτελείται πάντα το τελαυταίο μιας και υποθέτει ότι θα γίνουν όλα τόσο γρήγορα και δεν χρειάζεται να μεταβείς στις ενδιάμεσες καταστάσεις(repaints). Το πρόβλημα αυτό το είχα συνατήσει όντα ήθελα να φτιάξω ένα animation... Anw το καλύτερο θα ήταν να βάλεις τον αλγόριθμο της χρονοβόρας συνάρτησης μέσα σε ένα Thread πχ

Code: Select all

public class firstClass
{
  ...
   κάπου εδώ έχεις έναν handler για το event
   {
     myThread t = new myThread();
     t.start();
   }
}

class myThread extends Thread
{ 
   firstClass toUpperClassPointer;
  ...ότι private μέλη θέλεις για να υλοποιήσεις την συνάρτηση σου
   //κατασκευαστής
   myThread(firstClass f,...)
   {
     toUpperClassPointer = f;
     ....
    }
  //ακυρώνεις την run
  public void run
  { 
    toUpperClassPointer.label.setText("Perimene");
    //και εδώ γράφεις την συναρτησούλα σου
   toUpperClassPointer.label.setText(""); 
   }  
}
Απλά πρόσεξε να δώσεις πρόσβαση στην δεύτερη τάξη να πειράζει τα πεδία της πρώτης (κοινός δήλωσε τo label protected για να μπορεί το thread να το πειράζει χωρίς να καλείς άλλες συναρτήσεις για να κάνεις set το label κλπ κλπ
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Mon May 30, 2005 9:19 pm

Ευχαριστώ Βασιλάκη! :smile: :smile:

Θα το προσπαθήσω αύριο. Καλό ακούγεται πάντως, και ήσουν αρκετά σαφής.
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Fri Jun 03, 2005 12:48 am

Done!!! Eυχαριστώ πολύ guys...
Αυτό που έκανα ήταν να φτιάξω μέσα στο gui μου ένα thread:

Code: Select all

new Thread
{
   public void run()
   {
        label.setText("Wait");
        //κώδικας συνάρτησης
        label.setText("Finito");
   }
}.start();
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Fri Jun 03, 2005 1:32 am

Καλό πράγματα τα threads αλλά δυστιχώς το Swing δεν είναι thread safe οπότε καλό θα είναι να κάνεις τα πάντα μόνη σου με ένα threadάκι εάν δεν είναι trivial.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Post Reply

Return to “Προγραμματισμός”