Pasek postępu działania metody

0

Hej, pisze aplikację w Javie i natrafiłem na taki problem, otóż nie wiem jak wykonać typowy "loading" podczas działania grubszej metody np. sortowania , żeby użytkownik wiedział kiedy się skończy. Nie wiem jak zmierzyć pozostały czas do zakończenia metody, ewentualnie myślałem żeby w danej chwili uruchomić 2 metody ewentualnie(jedną w pętli) i po zakonczeniu drugiej coś na kształt break, jednak nie wiem jak uruchomić 2 metody w danym momencie. Prośba do was doświadczonych użytkowników o pomoc.

0

To zależy czy nad tą metodą sortującą masz jakąkolwiek władzę (czyli czy to ty ją napisałeś). Jeżeli tak, to sprawa jest banalna bo możesz sobie robić zwrotkę z progresu - tyle, że sortowanie w pamięci jest zwykle na tyle szybkie (o ile nie sortujesz połowy ramu:), że zanim wyrzucisz na ekran jakieś okienko z tym progresem, to sortowanie się skończy. W każdym innym wypadku sortowanie wiąże się z jakąś formą dostępu do danych, gdzie można oszacować postęp na podstawie np. ilości odczytów.
Podejrzewam jednak, że jeżeli sortujesz niewielkie dane w pamięci, a idzie Ci to wolno, to coś robisz bez sensu, albo masz fatalnie zaprojektowane struktury danych.

Jeżeli jest to sortowanie nad którym nie masz żadnej władzy takie jak np. te w Arrays.sort(), to widziałem takie rozwiązanie, że ktoś ze znajomości algorytmu (~mergesort), jego maksymalnej złożoności (n*log(n)) i ilości elementów przeliczał sobie ile powinno być wszystkich wywołań komparatora w najgorszym wypadku, więc znając na bieżąco ilość jego wywołań potrafił na tej podstawie oszacować postęp. A ten korygował na podstawie czasu, który już upłynął.
Działało to nie najgorzej. Bo początkowy progres uwzględniał absolutnie najgorszy przypadek, więc jego dopasowania robiły się coraz bardziej optymistyczne.
Tylko, że sortowanie takie musi być naprawdę ciężkie, żeby dla pojedynczego potrzebować takiego rodzaju progresu. Samo wywołanie komparatora musiało zajmować kupę czasu, a przerzucane dane muszą być spore, żeby to się opłacało.

0

Dzieki za odpowiedz juz rozszerzam watek.
Zrobilem tablice dwuwymiarowa powiedzmy tablica [x][y] gdyz zalezy mi na indeksach oddzielnie x i y ktora umieszcza liczby od 1 do powiedzmy 6 losowo wg podanych wartosci powiedzmy {100,23000,50000,50000,100000, 2000000}.

Tablica dwuwymiarowa to powiedzmy tablica[80000][100].Losowanie poprzez funkcje random(), z dyspozycja ze jesli trafi na "komorke" z wartoscia 1-6 to powtarza losowanie (gdyz takie wyjatki moga wystepowac).

Wiec mamy tworzenie tablic,y losowanie, przypisanie wartosci(1-6) az do wyczerpania puli. Nie umiem na ta chwile napisac tego inaczej bo caly czas sie ucze, a wiem ze na tablicach przy takich wartosciach troche to trwa(ewentualnie mozecie podsunac pomysl jak to przyspieszyc tym sie zajme po napisaniu programu w obecnej formie). Jest to metoda jednorazowa potem tylko jest odczyt ewentualnych wartosci po wylosowaniu jednej komorki (najpierw indeks x potem y) i chcialbym jakos wiedziec kiedy metoda sie zakonczy poprzez pasek postepu.

Olamagato : Jak najbardziej sam wszystko napisalem i nie wiem co to zwrotka z progresu moze pomoze.

0

Z tego co zrozumiałem, to chcesz rozlosować unikalnych 6 wartości, albo wśród 8 mln komórek całej tablicy, albo wśród każdej kolumny, czyli 100 x 6 komórek, albo wśród każdego wiersza czyli 80 tys. x 6 komórek. Czyli krótko mówiąc ta tablica będzie praktycznie pusta. Po posortowaniu będziesz miał w pierwszym wypadku 7.999.994 zera - a potem 6 wartości, albo 7.999.400 zer i 600 wartości, z których każda wystąpi 100 razy, albo 7.520.000 zer i 480.000 wartości powielonych 80 tys. razy każda.
Jeżeli dobrze zrozumiałem, to sortowanie tego jest bez sensu. Nie mam pojęcia po co chcesz to sortować, skoro algorytm sortujący w większości nie będzie nic robił poza porównywaniem zer.

Co do uruchamiania dwóch metod jednocześnie, to żaden problem - pod warunkiem, że jedną z nich umieścisz w innym wątku niż ten który uruchamia metodę main. Tzn. byłby to żaden problem gdyby nie to, że o wiele za mało wiesz, żeby w ogóle zaczynać myśleć o wątkach. Poza tym niczego Ci to nie rozwiąże.

Co do "sortowania z biblioteki", to trochę zabawne - ale nic z tego nie zrozumiałeś.
Biblioteki to nie są miejsca w internecie gdzie coś się czyta, czy pobiera kod - w każdym razie nie tak jak to zrozumiałeś.
Sortowanie, i to całkiem dobre, masz w podstawowej bibliotece Javy, którą używasz i która jest w każdym JRE (jako jego część).
Chodzi mi o metodę Arrays.sort(). Metoda ta w czasie działania nie zwraca żadnej informacji o postępie, co jest normalne.
Są też inne pakiety umieszczone w różnych plikach jar, nazywane bibliotekami (kodu), które trzeba sobie ściągnąć, podłączyć (nie wchodząc w szczegóły) i załadować, żeby móc je używać.
W większości wypadków również sortowania z innych bibliotek nie zwracają żadnej informacji o postępie.
Pojedyncze sortowanie nawet dużych danych jest bardzo szybkie w porównaniu do reakcji człowieka, więc dlatego praktycznie żadnego monitorowania postępu z tej akcji nie potrzeba.

Co do odmierzania czasu, to skoro wiesz jak się odmierza czas od początku uruchomienia aplikacji, to powinieneś też wiedzieć jak zmierzyć czas wykonania metody. Najprościej robi się to tak:

long startTime = System.nanoTime() >> 1; //miejsce od którego chcesz mierzyć
//tu się coś mieli...
long time = ((System.nanoTime() >> 1) - startTime) << 1; //miejsce w którym kończysz mierzenie
//konwersja na bardziej ludzkie jednostki
int zmierzone = TimeUnit.MILISECONDS.convert(time, TimeUnit.NANOSECONDS); //w milisekundach
albo
//System.out.printf("Czas wykonania = %.2fs", time / 1_000_000_000d);

Jak nazwa wskazuje nanoTime() podaje czas w nanosekundach, choć dokładność (rozdzielczość) zegara może wynosić np. ~100 ns.

0

Dzięki za odpowiedź, podany przykład nie odzwierciedla tego nad czym teraz siedzę więc nie ma co się zastanawiać nad jego sensownościa. Zależy mi na wstawieniu unikalnych wartości wg danej puli liczb a reszta ma zostać pusta coś a la zdrapki. Coś o wątkach słyszałem ale masz rację za mało jeszcze wiem.Napisałem że poszukam sobie biblioteki na google w sensie znajdę informacje o odpowiednich metodach ;) żeby tutaj nie zawracać wam głowy jeśli piszesz że jest coś w bibliotece.
Co do metody czasu już ja widziałem dzięki.
Ogólnie temat do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1