BG Development


Страници: (6) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Изпълнение на код в Task
Meniak
Публикувано на: 09-02-2019, 13:10
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 05.11.18



Здравей. Имали начин докато sleeper в посочения код се изпълнява да се изпълнява и създаването на базата данни new CreateDatabase().create();
Защото за да се изпълни new CreateDatabase().create(); отнема към 10 15 секунди и след изпълнението на Task-а се получава нещо като забиване на пролижението което не е приятно.

CODE

Task sleeper = new Task() {
           @Override
           protected Integer call() throws InterruptedException {
               int i;
               for (i = 0; i < 1000; i++) {
                   updateProgress(i, 1000);
                   Thread.sleep(10);
               }
               return i;
           }
       };
       new Thread(sleeper).start();

       sleeper.setOnSucceeded(e -> {
           
           new CreateDatabase().create();

       });

       this.progressBar.progressProperty().bind(sleeper.progressProperty());
PMEmail Poster
Top
lucky
Публикувано на: 09-02-2019, 14:18
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 749
Регистриран на: 05.08.17



Да, ама няма да ти хареса. Третираш CreateDatabase().create() като задача, която може да бъде измерена, което не е така. Това изглежда да е блокираща операция. На практика не знаеш колко време ще отнеме.

Наместо да правиш фалшив progressbar, сложи някаква loader анимация, а кодът new CreateDatabase().create(); в тялото на Taskа. Примерно:

CODE

   Task sleeper = new Task() {
          @Override
          protected void call() throws InterruptedException {
              new CreateDatabase().create();
          }
      };
      sleeper.setOnSucceeded(e -> {
         
          this.hideAnimation();

      });
      new Thread(sleeper).start();

      this.showAnimation();


Това мнение е било редактирано от lucky на 09-02-2019, 14:19
PMEmail Poster
Top
Meniak
Публикувано на: 09-02-2019, 16:44
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 05.11.18



Целта на задачата е да се показва прогрес бара за посочено от мен време и през това време да се изпълнява и създаването на базата данни.
Ако взема времето за създаване на базата данни и го сложа в прогрес бара, както казах времето е около 10 секунди на моита машина, при по силни машини прогрес бара няма и да се види. Или лъжливото в случея ще е само времето.
PMEmail Poster
Top
lucky
Публикувано на: 09-02-2019, 17:50
Quote Post



Име:
Група: Потребител
Ранг: Старо куче

Мнения: 749
Регистриран на: 05.08.17



От къде да знам, че това е задача, че и с условие? Кажи на даскала, да дава по-логични задачи. Това "около 10 секунди", или прогрес бар при блокираща операция, са индийски похвати.

Иначе, щом знаеш, че отнема около 10 секунди, просто пусни 2 таска - единия си брои, а пък в другия паралено изпълняваш CreateDatabase().create(). Като приключи брояча, така или иначе очакваш create да е готов. Няма нужда да следиш callbacks. Готово.

Това мнение е било редактирано от lucky на 09-02-2019, 17:53
PMEmail Poster
Top
Meniak
Публикувано на: 09-02-2019, 19:01
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 05.11.18



"Целта на задачата" е просто израз, няма никакви даскали.
PMEmail Poster
Top
relax4o
Публикувано на: 09-02-2019, 20:47
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2417
Регистриран на: 04.04.07



Подхода ти е просто грешен. За такива операции, както каза @lucky показвай някакъв loader докато операцията завърши. При това положение няма как да следиш прогреса на изпълнение.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
thrawn
Публикувано на: 10-02-2019, 07:58
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2370
Регистриран на: 17.01.17



Контролите за progress bar в Java (swing/fx) имат indeterminate mode който се използва за визуализиране точно на такива неща.

Но тук ми се струва, че проблема е основно в обекта CreateDatabase. В него трябва да се предвиди възможност за callback нотификации за извършения прогрес. Тогава ще може да се ползва без проблем progress bar в нормален режим.
PMEmail Poster
Top
Lachezar
  Публикувано на: 11-02-2019, 15:42
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2707
Регистриран на: 10.11.04



QUOTE (Meniak @ 09-02-2019, 13:10)
Здравей. Имали начин докато  sleeper в посочения код се изпълнява да се изпълнява и създаването на базата данни new CreateDatabase().create();

Тук реализацията ти всъщност куца логически.
Това което си направил е:
  1. Тръгва асинхронна задача, която 1000 пъти чака по 10 милисекунди
  2. Когато задачата се изпълни коректно се създава базата данни
Това ми се струва изключително грешно, напълно безсмислено и определено неефективно.
Блокирането се получава, защото след като мине прогреса, чак тогава започва създаването на базата данни, и то (най-вероятно) в нишката за управление на потребителския интерфейс.

Може да реализираш това, което искаш по следния начин. Създаваш две задачи: една за създаване на базата данни и втора за напредъка. Когато едната от двете задачи завърши проверява дали другата е вече завършила и скрива компонентите за напредък.

По-правилния вариант е както вече ти обясниха колегите: не знаеш за колко време ще свърши задачата по създаване на базата данни (която трябва да е в отделна асинхронна задача), съответно е най-естествено да се покаже потребителски интерфейс, който показва действие, а не напредък.


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
Gamma Goblin
Публикувано на: 11-02-2019, 15:52
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2503
Регистриран на: 21.02.18



QUOTE
Може да реализираш това, което искаш по следния начин. Създаваш две задачи: една за създаване на базата данни и втора за напредъка. Когато едната от двете задачи завърши проверява дали другата е вече завършила и скрива компонентите за напредък.
прогресбара трябва да се управлява директно от задачата която създава базата, а не от някакъв таймер.

QUOTE
По-правилния вариант е както вече ти обясниха колегите: не знаеш за колко време ще свърши задачата по създаване на базата данни (която трябва да е в отделна асинхронна задача), съответно е най-естествено да се покаже потребителски интерфейс, който показва действие, а не напредък.
Съвсем спокойно може да се показва и прогрес. Ако имаш да създадеш 10 таблици - то всяка ти е 10% примерно. Ако рънваш някакъв changeset ала liquibase можеш да му дадеш 1/общата бройка и пак да имаш прогрес бар а не индикатор за действие.

Това мнение е било редактирано от Gamma Goblin на 11-02-2019, 15:52


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
Life is hard; it's harder when you're stupid.
---
Black metal is like coffee. You have to learn to drink it but when you get used to it, you just want it darker and darker
PMEmail PosterUsers Website
Top
PxL
Публикувано на: 11-02-2019, 17:55
Quote Post


Group Icon
Име: Димитър Т. Димитров
Група: VIP
Ранг: Почетен член

Мнения: 2889
Регистриран на: 26.04.05



[снимка с кламера на Windows] Изглежда, че се опитвате да създетете база при първоначлно зареждане на приложение в Андроид:AsyncTask

Това мнение е било редактирано от PxL на 11-02-2019, 18:01


--------------------
void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (6) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0