/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Synkronisering med knap .. ?
Fra : Soren Kuula


Dato : 08-07-01 14:44

Hej,

er der nogen der kan hj?lpe med et simplet problem :

Jeg har en applet med en noget sn?rklet metode, der opbygger et billed (af
en graf).
Nu vil jeg have en button med i applet'en, s? jeg kan se opbygningen af
grafen skridt for skridt, ved at inds?tte 'noget' (et wait, m?ske) der
standser graf-metoden efter hver del af grafen er tegnet, og noget andet i
actionListeneren for knappen, der tillader graf-metode at forts?tte til
n?ste wait.

Men jeg har helt glemt hvordan det kan g?res .. f?r jeg brug for at starte
en thread mere ?
Har nogen et simpelt forslag ?

Mvh
S?ren




 
 
Simon Mikkelsen (08-07-2001)
Kommentar
Fra : Simon Mikkelsen


Dato : 08-07-01 23:12

D. Sun, 8 Jul 2001 15:43:46 +0200 syntes "Soren Kuula" <s_kuula@yahoo.com>
at dk.edb.programmering.java skulle vide at
<LqZ17.128$qm6.2090@news.get2net.dk>.

>Jeg har en applet med en noget sn?rklet metode, der opbygger et billed (af
>en graf).
>Nu vil jeg have en button med i applet'en, s? jeg kan se opbygningen af
>grafen skridt for skridt, ved at inds?tte 'noget' (et wait, m?ske) der
>standser graf-metoden efter hver del af grafen er tegnet, og noget andet i
>actionListeneren for knappen, der tillader graf-metode at forts?tte til
>n?ste wait.
>
>Men jeg har helt glemt hvordan det kan g?res .. f?r jeg brug for at starte
>en thread mere ?
>Har nogen et simpelt forslag ?

Hvis hvert skridt tager nogle sek, vil en tråd være en god idé, for at
undgå at brugerfladen fryser under beregningerne. Ellers vil jeg mene at du
godt kan klare dig uden en ekstra tråd.

Vælger du ikke at lave en ny tråd, kan du bruge wait() til at få den til at
holde pause, og du kan så sætte den igang igen med notifyAll(). Begge er
nedarvet fra Object, så du kan bare bruge dem. Det er denne metode du skal
bruge, hvis man skal trykke på en knap for at fortsætte.

Du kan også benytte static void sleep(long soveTidIMillisek) fra Thread, så
du skriver Thread.sleep(1000); for at holde en pause på 1 sek. Så skal du
bare huske at importerer java.lang.Thread .


Nu ved jeg ikke hvor meget du går op i at adskille GUI og selve programmet,
men hvis du laver en ekstra tråd, og vil gøre det "rigtigt", skal du nok
lave et interface eller to (til kommunikation mellem hovedprogrammet og
tråden), men hvis det skal gøres hurtigt, laver du en tråd ved at nedarve
Thread, og den kode der skal køres, skal du skrive i en metode der hedder
public void run() - selve tråden starter du ved at kalde
objektnavn.start(), som jo er nedarvet fra Thread.

Kommunikationen mellem de to sker som sagt bedst IMHO ved hjælp af
interfaces, hvor laver noget med et observer-mønster, men hvis det ikke er
et større projekt du har gang i (som andre ikke skal vedligeholde eller
genbruge dele fra senere), kan du nok godt klare dig uden en ekstra tråd


--
Mvh. Simon Mikkelsen, ingeniørstuderende

www.zipstat.dk Gratis, reklamefri tæller/statistik til enhver hjemmeside
-Se bla. hvor dine besøgende kommer fra, og brug den usynlige tællerkode.

dongfang xu (09-07-2001)
Kommentar
Fra : dongfang xu


Dato : 09-07-01 18:09

Hej Simon, tak for svaret, hej alle jer andre

> Hvis hvert skridt tager nogle sek, vil en tråd være en god idé, for at

> undgå at brugerfladen fryser under beregningerne. Ellers vil jeg mene at du
> godt kan klare dig uden en ekstra tråd.
>

Jeg fik det faktisk løst selv, med en ekstra tråd, og med wait() og notify().
Det der forvirrede mig der var nok mest at finde et passende objekt at lock'e
på - det blev den ekstra tråd, der fik en synchroniozed på sin run. Det virker
fint nu. Jeg fandt ud af at med bare en tråd bliver grafikken ikke opdateret
før en wait(), og i hvert fald heller ikke meds tråden der skal opdatere den
er blokket. F. eks.

<gør noget ved dataene, så næste kald af repaint giver et anderledes billed>
repaint();
try{wait();} catch(InterruptedException fnyx) {}

når slet ikke at repainte nogetsomhelst. paint er noget underligt noget
(spawner den mon osse selv en thread, der venter lidt på at alle kald af paint
er faldet til ro, hvis der kommer urimeligt mange indenfor en kort tid ? Ser
sådan ud !).

Så to tråde. Men der er stadig et lille problem. Programmet skal demonstere en
bestemt algoritme på en graf, og udover den knap vi allerede har talt om, er
der nu en knap mere, restart, der skal vise en ny optimering, selvom den
nuværende ikke er færdig endnu. Som det er nu, er den ene thread til
brugerinterface, og den anden til optimeringen .. og aargh, jeg fandt jo ud af
at brugerinterface-tråden tilsyneladende ikke har nogen mulighed for at
standse optimizer-tråden og slå den ihjel. Selvom man derefererer den, kører
den videre .. !?

Spørgsmål : Kan man slå en Trread ihjel fra en anden, eller er der ikke andet
at gøre end at indføre en variable go, som nr. 2. Thread så tjekker en gang
imellem og dør sig selv, hvis go er false ?

Mvh
Søren
kinesisk-studerende (fakta !!)



Lars (10-07-2001)
Kommentar
Fra : Lars


Dato : 10-07-01 11:47


> Spørgsmål : Kan man slå en Trread ihjel fra en anden, eller er der ikke
andet
> at gøre end at indføre en variable go, som nr. 2. Thread så tjekker en
gang
> imellem og dør sig selv, hvis go er false ?

Det er den absolut pæneste løsning at lade run-metoden i den enkelte Thread
færdig-eksekvere. En condition-variabel er derfor en god idé. Det eneste
problem der skal tages højde for er, hvis tråden er blokeret. Den skal så ud
af blokeringen før den kan tjekke en evt. condition-variabel og
færdigeksekvere.

Jeg studsede derudover, at du havde synkroniseret din run-metode, men det
er der sikkert en fornuftig forklaring på

/Lars



Soren Kuula (10-07-2001)
Kommentar
Fra : Soren Kuula


Dato : 10-07-01 20:24

Hej Lars + andre,

> En condition-variabel er derfor en god id? Det eneste
> problem der skal tages højde for er, hvis tråden er blokeret. Den skal
s?ud
> af blokeringen før den kan tjekke en evt. condition-variabel og
> færdigeksekvere.
>
> Jeg studsede derudover, at du havde synkroniseret din run-metode, men det
> er der sikkert en fornuftig forklaring p?

Ja, dovenskab .. jeg kan jo se at man skal ?benbart synkronisere p? et eller
andet n?r man wait'er eller notify'er (og det skal v?re det samme objekt for
den samme tr?d, eller .?.?.? (jeg var vist ikke fattet den del af det 100%
endnu)).
S?, i mangel p? bedre (ideer til) objekter at synce p? tog jeg optimizer
Thread'en, og satte en synchronized p? run. Det duer i hvert fald :)

PS : Dongfang xu er osse mit, fra en anden maskine.

MVH
S?ren




Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste