Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
-
semika
- Mbyte level

- Posts: 998
- Joined: Sat May 01, 2004 2:21 pm
- Location: Αθήνα - Β.Π.
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. Μπορεί κάποιος να με βοηθήσει??
Ευχαριστώ πάντως

-
PaP
- 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 αλλά θα πρέπει να τα συγχρονήσεις.
-
Einherjar
- 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]
-
semika
- 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 ?
-
PaP
- 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
-
semika
- Mbyte level

- Posts: 998
- Joined: Sat May 01, 2004 2:21 pm
- Location: Αθήνα - Β.Π.
Post
by semika » Mon May 30, 2005 3:50 pm
-
AmmarkoV
- 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η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει 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]

-
semika
- 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η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει flush το buffer..
Ή μήπως πρέπει να ξαναζωγραφήσεις τα αντικείμενα (για να ανανεωθεί το κείμενο) Στο δικό μου gui χρειάζεται το 2ο..
Ελπίζω να βοήθησα καθόλου..
Κι εγώ κουφό το βρίσκω.
Είχα βάλει label.repaint() και πάλι στο τέλος τα εκτελεί
-
HdkiLLeR
- 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η εντολή.
Κουφό..
Μήπως υπάρχει κάποια εντολή που να κάνει 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
-
semika
- Mbyte level

- Posts: 998
- Joined: Sat May 01, 2004 2:21 pm
- Location: Αθήνα - Β.Π.
Post
by semika » Mon May 30, 2005 9:19 pm
Ευχαριστώ Βασιλάκη!
Θα το προσπαθήσω αύριο. Καλό ακούγεται πάντως, και ήσουν αρκετά σαφής.
-
semika
- 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();
-
HdkiLLeR
- 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