Page 1 of 1
Java - swing - threads
Posted: Mon May 30, 2005 12:59 pm
by semika
Eχω το εξής πρόβλημα.
Εχω κατασκευάσει μία διεπαφή με διάφορα κουμπάκια και μία label.
Οταν πατάς το ένα κουμπί εκτελείται μία συνάρτηση (που παίρνει πολύ χρόνο). Οσο εκτελείται θέλω να εμφανίσω στην label ενα μήνυμα "Περίμενε" και όταν εκτελεστεί να το σβήσω.
Κανω το εξής μεσα στο actionPerformed του κουμπιού:
Code: Select all
label.setText("Perimene");
xronovora_synarthsh();
label.setText("");
Ωστόσο πάλι εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
Από ότι κατάλαβα κάτι παίζει με τα threads. Μπορεί κάποιος να με βοηθήσει??
Ευχαριστώ πάντως

Posted: Mon May 30, 2005 1:10 pm
by PaP
Το καλύτερο νομίζω που μπορείς να κάνεις είναι να κάνεις setText μέσα στη χρονοβόρα συνάρτηση στην αρχή της και πριν επιστρέψει να ξανακάνεις setText οκ.
Η αλλιώς πρέπει να έχεις διαφορετικά threads ένα για τη χρονοβόρα και ένα για το Gui αλλά θα πρέπει να τα συγχρονήσεις.
Posted: Mon May 30, 2005 1:32 pm
by Einherjar
Υποθέτω ότι το setLabel είναι buffered και έτσι μέχρι να τεθεί η τιμή έχει μπει μέσα στη μέθοδο. Αυτό που σου προτείνω (αυτό κάνω πάντα) είναι να βάλεις τη μέθοδο αυτή σε μια τάξη που θα τρέχει σε ξεχωριστό thread. Δε νομίζω να θες να κολάει όλη η διεπαφή όταν μπαίνει στη μέθοδο αυτή
Posted: Mon May 30, 2005 2:16 pm
by semika
Ευχαριστώ και τους δύο
Einherjar wrote:Υποθέτω ότι το setLabel είναι buffered και έτσι μέχρι να τεθεί η τιμή έχει μπει μέσα στη μέθοδο. Αυτό που σου προτείνω (αυτό κάνω πάντα) είναι να βάλεις τη μέθοδο αυτή σε μια τάξη που θα τρέχει σε ξεχωριστό thread. Δε νομίζω να θες να κολάει όλη η διεπαφή όταν μπαίνει στη μέθοδο αυτή
Nai. αυτό είχα καταλάβει κι εγώ, αλλά δεν ξέρω πως να το βάλω σε νέο thread.
Αρκεί να κάνω την τάξη implements runnable ?
Posted: Mon May 30, 2005 2:40 pm
by PaP
ΜΠορείς να κάνει κάνεις μία ταξη απλά extends Thread
Posted: Mon May 30, 2005 3:50 pm
by semika
Posted: Mon May 30, 2005 4:08 pm
by AmmarkoV
semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Ή μήπως πρέπει να ξαναζωγραφήσεις τα αντικείμενα (για να ανανεωθεί το κείμενο) Στο δικό μου gui χρειάζεται το 2ο..
Ελπίζω να βοήθησα καθόλου..
Posted: Mon May 30, 2005 4:44 pm
by semika
AmmarkoV wrote:semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Ή μήπως πρέπει να ξαναζωγραφήσεις τα αντικείμενα (για να ανανεωθεί το κείμενο) Στο δικό μου gui χρειάζεται το 2ο..
Ελπίζω να βοήθησα καθόλου..
Κι εγώ κουφό το βρίσκω.
Είχα βάλει label.repaint() και πάλι στο τέλος τα εκτελεί
Posted: Mon May 30, 2005 7:18 pm
by HdkiLLeR
AmmarkoV wrote:semika wrote:εκτελείται πρώτα η συνάρτηση και μετά γίνονται ταυτόχρονα η 1η και 3η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει 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 κλπ κλπ
Posted: Mon May 30, 2005 9:19 pm
by semika
Ευχαριστώ Βασιλάκη!
Θα το προσπαθήσω αύριο. Καλό ακούγεται πάντως, και ήσουν αρκετά σαφής.
Posted: Fri Jun 03, 2005 12:48 am
by semika
Done!!! Eυχαριστώ πολύ guys...
Αυτό που έκανα ήταν να φτιάξω μέσα στο gui μου ένα thread:
Code: Select all
new Thread
{
public void run()
{
label.setText("Wait");
//κώδικας συνάρτησης
label.setText("Finito");
}
}.start();
Posted: Fri Jun 03, 2005 1:32 am
by HdkiLLeR
Καλό πράγματα τα threads αλλά δυστιχώς το Swing δεν είναι thread safe οπότε καλό θα είναι να κάνεις τα πάντα μόνη σου με ένα threadάκι εάν δεν είναι trivial.