BG Development


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

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



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

Мнения: 28
Регистриран на: 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



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

Мнения: 748
Регистриран на: 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



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

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



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



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

Мнения: 748
Регистриран на: 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



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

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



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



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

Мнения: 2353
Регистриран на: 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



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

Мнения: 2100
Регистриран на: 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



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

Мнения: 2699
Регистриран на: 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



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

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



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

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

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


--------------------
https://www.rust-lang.org/
---
Недобросъвестните оратори се опитват да изкарат лошото добро.
---
PMEmail PosterUsers Website
Top
PxL
Публикувано на: 11-02-2019, 17:55
Quote Post


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

Мнения: 2771
Регистриран на: 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