Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Odottaminen (Java)

Sivun loppuun

Dain [16.12.2009 15:49:57]

#

Rupesin nyt vihdoin opetteleen tota javaa ja tein tuosta hello worldista pienen muunnoksen. Eli tuossa vaan 3 eri lausetta eri väreillä.

Nyt ois tarkotuksena saaha appletista sellanen, että se tulostaa ensiksi tuon Moro maailmalle, sitten se odottaa vaikka 5 sekuntia ja tulostaa sen jälkeen Jee tämähän toimii By dain jne.

Koitin jotain apua netistä ettiä mutta mitään mieltäylentävää en löytänyt. Jotain sleep tai wait juttua sielä oli, mutta sitä en tajunnut.


koodia:

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.*;
public class tekstintulostus extends Applet {
		public void paint (Graphics x)  {
		Color vihrea = new Color(0,225,0);
		Color sininen = new Color(0,0,225);
		Color punainen = new Color(225,0,0);
		x.setColor(vihrea);
				x.drawString("Moro maailmalle !!!",20,20);
				x.setColor(sininen);
				x.drawString("Jee tämähän toimii By Dain !!!",20,50);
			x.setColor(punainen);
			x.drawString("Ja tämähän on siis java-appletti",20,80);

			}
}

ps. Miten saan sillai, että toi näyttää ton koodin sillai järkevästi rivitettynä niinkuin olen joidenkin nähnyt tekevän.

Mod. lisäsi kooditagit!

Antti Laaksonen [16.12.2009 17:11:02]

#

Tässä on metodi, joka odottaa halutun ajan (millisekunteina):

public void odotus (int aika) {
    try {
        Thread.sleep(aika);
    } catch (Exception e) {
    }
}

Esimerkiksi voit odottaa viisi sekuntia kutsumalla metodia näin:

odotus(5000);

_Pete_ [18.12.2009 18:30:30]

#

Antti Laaksonen kirjoitti:

Tässä on metodi, joka odottaa halutun ajan (millisekunteina):

public void odotus (int aika) {
    try {
        Thread.sleep(aika);
    } catch (Exception e) {
    }
}

Esimerkiksi voit odottaa viisi sekuntia kutsumalla metodia näin:

odotus(5000);

Muuten hyvä paitsi:

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#sleep(long)

Sami [18.12.2009 19:22:26]

#

Paitsi että mitä?

_Pete_ [18.12.2009 19:40:10]

#

Sami kirjoitti:

Paitsi että mitä?

Thread.sleep() parametri on long eikä int.

FooBat [18.12.2009 19:49:14]

#

_Pete_ kirjoitti:

Sami kirjoitti:

Paitsi että mitä?

Thread.sleep() parametri on long eikä int.

Harvemmin sitä kumminkaan on tarvetta odotella 23 päivää enempää.

EiVoiOsata [18.12.2009 20:43:09]

#

Joo, mutta tuossahan otettiin kantaa tuohon, että tuo oli integer tuo aika.
Itse en ota kantaa onko se vai ei. En tiedä, en käyttänyt koskaan odotusta.

hk [18.12.2009 22:35:49]

#

Kyllä Java castaa sen intin longiksi.

Sami [18.12.2009 23:36:25]

#

byte -> short, short -> int, int -> long ja float -> double -muunnokset (eli muunnokset pienemmästä tietotyypistä suurempaan) onnistuvat aina, eikä tästä tule edes varoitusta. Sen sijaan käänteisesti muunnos ei välttämättä onnistu ja kääntäjä antaakin tästä virheen, mutta muunnoksen voi silti pakottaa itse jos haluaa.

Ja luulen että olet itsekin antanut tuolle sleep-metodille aika usein, ellet aina, int-tyyppisen arvon. Vai oletko kutsunut sitä ja muita long-tyyppiä haluavia metodeita aina sleep(1000l) tai sleep((long)1000)?

_Pete_ [19.12.2009 06:23:51]

#

Sami kirjoitti:

byte -> short, short -> int, int -> long ja float -> double -muunnokset (eli muunnokset pienemmästä tietotyypistä suurempaan) onnistuvat aina, eikä tästä tule edes varoitusta. Sen sijaan käänteisesti muunnos ei välttämättä onnistu ja kääntäjä antaakin tästä virheen, mutta muunnoksen voi silti pakottaa itse jos haluaa.

Ja luulen että olet itsekin antanut tuolle sleep-metodille aika usein, ellet aina, int-tyyppisen arvon. Vai oletko kutsunut sitä ja muita long-tyyppiä haluavia metodeita aina sleep(1000l) tai sleep((long)1000)?

Olet oikeassa. Mutta jos tekee utility-metodia sen ei kuulu kätkeä varsinaisen
metodin arvoa.

Jackal von ÖRF [19.12.2009 12:29:02]

#

Paint-metodissa nukkuminen ei ole kovin hyvä idea, koska se blokkaa koko käyttöliittymän. http://en.wikipedia.org/wiki/Event_dispatching_thread

hk [19.12.2009 22:29:49]

#

_Pete_ kirjoitti:

Olet oikeassa. Mutta jos tekee utility-metodia sen ei kuulu kätkeä varsinaisen
metodin arvoa.

Antti näyttää koodanneen Dainin speksaaman metodin, eli vastanneen kysymykseen.

Tuo metodi toimii nimenomaan annetun luokan metodina ja tuottaa toivottua suuruusluokkaa olevan viiveen. Se ei toimi staattisesta luokasta kutsuttuna, vaan silloin sille pitää antaa myös määre static.

Tiettyyn tarkoitukseen tehdyssä metodissa käytetään tarkoitusta vastaavia parametreja, joilla ei ole mitään tekemistä niiden arvojen kanssa, joita metodi sisäisesti käyttää. Mitään "varsinaista" metodia tässä ei ole, eikä yleensäkään ole, vaikka jokainen vähänkin monimutkaisempi metodi toki kutsuu useaakin muuta metodia.

_Pete_ [20.12.2009 13:37:40]

#

hk kirjoitti:

_Pete_ kirjoitti:

Olet oikeassa. Mutta jos tekee utility-metodia sen ei kuulu kätkeä varsinaisen
metodin arvoa.

Antti näyttää koodanneen Dainin speksaaman metodin, eli vastanneen kysymykseen.

Varmasti onkin. Jos tällainen ehdotelma tulisi töissä vastaan review-listalla
-> failed

Sen takia koska utility-metodin ei kuulu/saa kätkeä tällä tavalla parametrintyyppiä varsinaiseen kutsuun. Vaikka virheen mahdollisuus on se on
-> FAIL

Ohjelmoinnissa syy "toimii about oikein" on kaikista huonoin vaihtoehto.

hk [20.12.2009 15:44:25]

#

Kyllä se sisäisen rakenteen piilottaminen on päinvastoin enemmänkin olio-ohjelmoinnin perusperiaatteita kuin kiellettyä. Useinkin Javan valmiiden luokkien parametrit tai paluuarvot eivät vastaa sovelluksen tarvetta, jolloin on syytä kirjoittaa konversio väliin koodin lyhentämiseksi ja selkeyttämiseksi. Samanlaisiin ratkaisuihin päädytään välillä valmista koodia hyödynnettäessä. Silti usein kannattaa käyttää pohjana valmista luokkaa sen sijaan, että kirjoittaisi koko homman itse. Sisäisen ja ulkoisen datan erilaiselle muodolle voi olla monia hyviä tai jopa pakottavia syitä silloinkin, kun käsitellään primitiivityypin arvoja.


Em. metodissa ei ole minkäänlaista "virheen mahdollisuutta" sen takia, että kutsussa annetaan int eikä long. Koodin kirjoittaja ei ehkä ollut tarkoituksella valinnut suppeampaa arvoaluetta kuin olisi ollut mahdollista, mutta arvoalueen rajaaminen päinvastoin vähän ehkäisee ylipitkiä odotusaikoja, kun kerran tiedetään, että halutaan viivettä, jonka ajan käyttäjä jaksaa tuijottaa ruutua. Tässä ei siis ole mitään "about oikein toimivaa". Ei ole olemassakaan mitään "varsinaisia" kutsuja. Metodi voi kutsua toisia metodeja tai olla kutsumatta.

Dain [21.12.2009 18:58:40]

#

Sain jo avun :D voittehan te jatkaa rakentavaa väittelyänne tästä jos haluatte ei se minua haittaa...

Blaze [21.12.2009 20:15:12]

#

Kaikella kunnoituksella: tämä rakentava väittely on paljon hyödyllisempää kuin tuo alkuperäisen ongelman ratkaseminen :)

Ite en ymmärrä, mitä vikaa tuossa Antin metodissa nyt muka oli: jos joku tahtoo nukkua yli 23 päivää, kutsukoot Thread.sleepiä suoraan.

_Pete_ [25.12.2009 10:46:57]

#

hk kirjoitti:

Kyllä se sisäisen rakenteen piilottaminen on päinvastoin enemmänkin olio-ohjelmoinnin perusperiaatteita kuin kiellettyä.

Tuo on eriasia. Piilottamisen tarkoitus ei ole kuitenkaan se että sen avulla mahdollistetaan virhetilanne. Tai jos se tietentahtoen tehdään se pitää julkisessa metodikutsussa selvästi dokumentoida/perustella.

Antti Laaksonen [25.12.2009 13:28:31]

#

En ymmärrä vieläkään, mikä virhetilanne metodiini liittyy.

Tarkoitus ei ollut tehdä metodia, jonka kautta voi käyttää Thread.sleep-metodia, vaan metodi, jonka avulla voi odottaa halutun ajan.

hk [27.12.2009 01:21:04]

#

Ehkö Pete ajatteli väärin päin, että kutsussa on laajempi arvo kuin sisäisessä metodissa, jolloin voisi tulla virhetilanne? Näin ei ole.

Olisi kiva kuitenkin kuulla häneltä, mikä on utility-metodi, ja mitä lainalaisuuksia hänen mielestään sellaiseen liittyy. Koska utility-metodi ei ole mikään yleisesti tunnettu käsite. Haluaisin muös kuulla perustelun / tutkimuksen / lähteen, jonka mukaan tällaisen metodin pitäisi olla jotenkin tietynlainen.

Metabolix [27.12.2009 01:40:44]

#

Kääntäjä kyllä kertoo, jos argumentti on väärää (liian suurta) tyyppiä. Tuolle voi toki yrittää antaa long-arvon, aivan kuten Thread.sleep-funktiolle voi yrittää antaa liukuluvun. Molemmista tulee virheilmoitus. Niinpä tähän ei liity (parametrin tyypin puolesta) sen suurempaa virheen mahdollisuutta kuin tavalliseen sleep-kutsuunkaan.

Sen sijaan poikkeus olisi turvallisinta käsitellä jotenkin, edes tulostaa sen viesti virhevirtaan. Koska kyseessä on InterruptedException, voisi olla hyvä myös kutsua Thread.currentThread().interrupt(), tosin aloittelijan ohjelmassa tuskin on niin hienoa koodia, että tällä olisi merkitystä.

hk [27.12.2009 03:24:20]

#

Eikös se nyt ole jo moneen kertaan todettu, että parametri on ihan ok, kuten koko metodikin ajatellen pyydettyä käyttötarkoitusta?

Poikkeusta taas ei tässä tilanteessa saisi syntyä. Jos niin käy, ei sille oikein ole mitään tehtävissä "hienommassakaan" koodissa? Lähinnä tulee mieleen, että olisi jo viive-metodin alussa pantu ylös alkuaika, ja siinä tapauksessa voidaan odottaa haluttu aika ilman Thread.sleep()-kutsua.

Mutta Petelle esitetyt kysymykset ovat edelleen vastausta vailla.

Metabolix [27.12.2009 04:22:35]

#

hk kirjoitti:

Eikös se nyt ole jo moneen kertaan todettu, ...

Onhan se. Esitin kuitenkin perustelun, jota ei ole vielä suoraan sanottu; kaikki keskustelijat eivät välttämättä tiedä asiaa ennestään.

hk kirjoitti:

Poikkeusta taas ei tässä tilanteessa saisi syntyä. Jos niin käy, ei sille oikein ole mitään tehtävissä "hienommassakaan" koodissa?

Esimerkiksi monisäikeisessä ohjelmassa säikeen kuuluu usein sulkeutua. Jos poikkeus vain napataan, tieto keskeytyksestä ei välity. Seuraava säie jäisi siis ikuiseen silmukkaan:

class Tyo extends Thread {
  public void run() {
    while (!Thread.interrupted()) {
      // Tee jotain...
      odota(1000);
    }
  }
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta