Aktualizacja kilku progressBar-ów
Napisane: piątek, 16 września 2011, 01:39
No.. więc tak. Zacznę od kodu
To jest pierwsza wersja funkcji, dopiero staram się to wszystko poskładać w całość (oczywiście wyciąłem to co niepotrzebne).
hash - jest pewnym obiektem - reprezentuje konkretne pobieranie pliku (temat dotyczy aktualizacji progressBar-ów przy pobieraniu wielu plików)
download - jest obiektem klasy, który realizuje samo pobieranie dla danego obiektu (hash);
updateCallback - jest delegatą, która umożliwia aktualizację informacji (szybkość pobierania, pobrane dane, itp).
Jakby to teraz wytłumaczyć...
Obiekt ExtLVDownload jest odpowiednikiem ListView, na nim wyświetlane są wszystkie informacje (czyli progressbary) - załóżmy, że jedno pobieranie na jeden wiersz. Przyjmijmy, że pobieranych jest 5 plików. Dla każdego jest unikatowy obiekt hash, a tworzenie delegaty jest równoznaczne z rozpoczęciem pobierania.
Problem leży w tym, że instancja obiektu ExtLVDownload jest tylko jedna (co jest oczywiste), a do niej jest przypisanych (w tym wypadku) 5 delegat. Już chyba można się domyślić w czym problem.
Jak teraz odróżnić, która z aktualnie wywoływanych delegat powinna aktualizować dane dla którego wiersza.
No i tu nie wiem co zrobić, bo taka aktualizacja nie wysyła żadnych informacji na temat wysyłającego, więc ciężko ustalić który wiersz aktualizować.
Wiem, że można by dodać jeszcze jeden parametr do delegaty, który byłby np. unikatowym identyfikatorem klasy obiektu download, wcześniej tworząc sobie słownik <identyfikator, numer wiersza.
Może to głupie pytanie, ale chcę wiedzieć, czy tak to się robi ? Mam wrażenie, że kombinuje pod górkę. A konkretnych przykładów w internecie już ciężko znaleźć, to raczej dość precyzyjny i rzadki problem. Na razie to zostawiam, bo nie chcę niepotrzebnie mieszać w kodzie.
P.S. Jeśli coś jest niezrozumiałe, to mogę sprostować. Dla mnie kod jest oczywisty, bo cały czas przy nim siedzę, ale nie każdy może to tak łatwo zrozumieć.
KOD cpp: • UKRYJ •
Void Resume(int xxx)
{
hash->download->updateCallback = gcnew Download::UpdateProgressCallback(this, &ExtLVDownload::_ProgressUpdate);
};
{
hash->download->updateCallback = gcnew Download::UpdateProgressCallback(this, &ExtLVDownload::_ProgressUpdate);
};
To jest pierwsza wersja funkcji, dopiero staram się to wszystko poskładać w całość (oczywiście wyciąłem to co niepotrzebne).
hash - jest pewnym obiektem - reprezentuje konkretne pobieranie pliku (temat dotyczy aktualizacji progressBar-ów przy pobieraniu wielu plików)
download - jest obiektem klasy, który realizuje samo pobieranie dla danego obiektu (hash);
updateCallback - jest delegatą, która umożliwia aktualizację informacji (szybkość pobierania, pobrane dane, itp).
Jakby to teraz wytłumaczyć...
Obiekt ExtLVDownload jest odpowiednikiem ListView, na nim wyświetlane są wszystkie informacje (czyli progressbary) - załóżmy, że jedno pobieranie na jeden wiersz. Przyjmijmy, że pobieranych jest 5 plików. Dla każdego jest unikatowy obiekt hash, a tworzenie delegaty jest równoznaczne z rozpoczęciem pobierania.
Problem leży w tym, że instancja obiektu ExtLVDownload jest tylko jedna (co jest oczywiste), a do niej jest przypisanych (w tym wypadku) 5 delegat. Już chyba można się domyślić w czym problem.
Jak teraz odróżnić, która z aktualnie wywoływanych delegat powinna aktualizować dane dla którego wiersza.
No i tu nie wiem co zrobić, bo taka aktualizacja nie wysyła żadnych informacji na temat wysyłającego, więc ciężko ustalić który wiersz aktualizować.
Wiem, że można by dodać jeszcze jeden parametr do delegaty, który byłby np. unikatowym identyfikatorem klasy obiektu download, wcześniej tworząc sobie słownik <identyfikator, numer wiersza.
Może to głupie pytanie, ale chcę wiedzieć, czy tak to się robi ? Mam wrażenie, że kombinuje pod górkę. A konkretnych przykładów w internecie już ciężko znaleźć, to raczej dość precyzyjny i rzadki problem. Na razie to zostawiam, bo nie chcę niepotrzebnie mieszać w kodzie.
P.S. Jeśli coś jest niezrozumiałe, to mogę sprostować. Dla mnie kod jest oczywisty, bo cały czas przy nim siedzę, ale nie każdy może to tak łatwo zrozumieć.