Forum » Programiranje » Java threadi
Java threadi

l0g1t3ch ::
Imam aplicaijo ki je zaenkrat sestavljena iz 2h classov / threadov in sicer GUI del in pa background thread, ki neki preračunava.
Sedaj je narejeno tako, da ob zagonu aplikacije kreiram ta background thread mu podam referenco na JPanel, ki je na GUI delu nato pa thred steče in na Jpanelu vsakic ko dokonca izračun pokaže rezultat.
Problem je pa v tem da izracuni trajajao zelo različno dolgo od nekaj ms pa do cca 20s(redko). Tako, da se slike ne menjajo v lepih enako dolgih intervalih.
Razmišlju sm da bi nekak naredu en buffer v katerega bi ta background thread šopu rezultate, potem pa bi imel še nek drug thread recimo mu SlideShow, ki bi pobiral slike iz tega bufferja in jih prikazoval.
Sam se mi pa nič kaj ne sanja kako to delovanje uskladiti tako, da se bo prikaz začel šele ko bo v bufferju neko število slik in ga po potrebi tudi ustaviti če se buffer slučajno izprazni.
Če ima kdo kako idejo kako naj se zadeve lotim bi bil zelo vesel pomoči, hvala.
Sedaj je narejeno tako, da ob zagonu aplikacije kreiram ta background thread mu podam referenco na JPanel, ki je na GUI delu nato pa thred steče in na Jpanelu vsakic ko dokonca izračun pokaže rezultat.
Problem je pa v tem da izracuni trajajao zelo različno dolgo od nekaj ms pa do cca 20s(redko). Tako, da se slike ne menjajo v lepih enako dolgih intervalih.
Razmišlju sm da bi nekak naredu en buffer v katerega bi ta background thread šopu rezultate, potem pa bi imel še nek drug thread recimo mu SlideShow, ki bi pobiral slike iz tega bufferja in jih prikazoval.
Sam se mi pa nič kaj ne sanja kako to delovanje uskladiti tako, da se bo prikaz začel šele ko bo v bufferju neko število slik in ga po potrebi tudi ustaviti če se buffer slučajno izprazni.
Če ima kdo kako idejo kako naj se zadeve lotim bi bil zelo vesel pomoči, hvala.
hasek ::
Mogoce bi si lahko pogledal metode wait() pa notify ter notifyAll() morda ti bodo pomagale
dejansko lahko naredis tako da recimo tisti GUI caka na notifikacijo iz drugega threda, da je koncal. (ali pa naredis to preko se enega threda in tisti caka na notifikacijo da osvezi Jpanel
dejansko lahko naredis tako da recimo tisti GUI caka na notifikacijo iz drugega threda, da je koncal. (ali pa naredis to preko se enega threda in tisti caka na notifikacijo da osvezi Jpanel
there is no hope for you
gearsonalex ::
You can solve this cleanly by using a producer/consumer pattern with a blocking queue.
Let the calculation thread be the "producer" and push finished images into a `BlockingQueue` (e.g. `LinkedBlockingQueue`). Then have a separate slideshow thread (or Swing Timer) act as the "consumer" and take images from the queue at a fixed interval.
If the queue is empty, `take()` will automatically block until a new image arrives, so you don't need manual stop/start logic. If you want to wait until the buffer has e.g. 5 images before starting, you can simply check `queue.size()` first or use a `CountDownLatch` to signal when enough images are available.
Also make sure GUI updates are done on the EDT using `SwingUtilities.invokeLater()` (or use a `SwingWorker`).
This way your calculations can run at variable speed, while the UI slideshow stays smooth and evenly timed.
Let the calculation thread be the "producer" and push finished images into a `BlockingQueue` (e.g. `LinkedBlockingQueue`). Then have a separate slideshow thread (or Swing Timer) act as the "consumer" and take images from the queue at a fixed interval.
If the queue is empty, `take()` will automatically block until a new image arrives, so you don't need manual stop/start logic. If you want to wait until the buffer has e.g. 5 images before starting, you can simply check `queue.size()` first or use a `CountDownLatch` to signal when enough images are available.
Also make sure GUI updates are done on the EDT using `SwingUtilities.invokeLater()` (or use a `SwingWorker`).
This way your calculations can run at variable speed, while the UI slideshow stays smooth and evenly timed.
Zgodovina sprememb…
- predlagal izbris: predi ()
Vredno ogleda ...
| Tema | Ogledi | Zadnje sporočilo | |
|---|---|---|---|
| Tema | Ogledi | Zadnje sporočilo | |
| » | ios swift 1.2Oddelek: Programiranje | 2021 (1427) | detroit |
| » | [Java]Client/Server preko socketaOddelek: Programiranje | 2512 (2348) | KernelPanic |
| » | [VB] datagridviewOddelek: Programiranje | 2244 (1627) | korenje3 |
| » | [Netbeans-Java]Embossing,blurring,sharpeningOddelek: Programiranje | 1450 (1352) | t3hn0 |
| » | [C++ DirectX] DirectSound vodič za začetnikeOddelek: Programiranje | 2102 (1888) | W3by |