przepisywanie danych z dataset do widoku listy w watku

dział ogólny

przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » środa, 4 marca 2009, 18:10

taki kod:
Kod: Zaznacz cały
   while(! Form1->SQL->Eof)
   {
      id = Form1->SQL->FieldByName("id")->AsInteger;
      name = Form1->SQL->FieldByName("nazwa")->AsString;
      mail = Form1->SQL->FieldByName("opis")->AsString;

      ListView1->Items->Add();

      ListView1->Items->Item[licznik]->SubItems->Add(id);
      ListView1->Items->Item[licznik]->SubItems->Add(name);
      ListView1->Items->Item[licznik]->SubItems->Add(mail);

      ++licznik;
      Form1->SQL->Next();
   }

powyzsze przepisywanie chce wykonac w watku klasy TThread dostepnej w bcb.
w przypadku tej klasy kazde odwolanie do obiektow VCL nalezy wykonac za pomoca funkcji Synchronize. funkcja ta to odwolanie przekazuje do watku glownego aplikacji.

w powyzszej petli kazda linijka poza ++licznik zawiera odwolanie do obiektu VCL. jesli kazde takie odwolanie umieszcze w Synchronize to uzycie watki mija sie z celem bo i tak zablokuje watek glownego procesu aplikacji. jak zatem wykonac takie przepisanie danych w osobnym watku tak aby wykonalo sie to w tle bez zamrozenia glownego watku?

jescze jedno pytanie:
http://cyfbar.republika.pl/differ5.html#d10
jak wykonac poruszanie tym progresbarem w watku skoro zawartosc petli rowniez odwoluje sie do VCL?


nie chce wyciagac pochopnych wnioskow ale czytajac dokumentacje wychodzi na to ze bcb opiera sie na VCL, ma wbudowana klase do obslugi watkow ktora z jest bezuzyteczna ... w zasadzie nei nadaje sie do zadnej operacjiw tle na kontrolkach VCL bo wszystko w synchronize zamrozi glowny watek... jesli tak nie jest prosze mnie wyprowadzic z bledu.
oczywiscie zakladamy ze dokumentacja nie klamie i KAZDE odwolanie do VCL musi byc przez synchroznie, bez wzgledu na to czy to czytanie, zapisywanie, modyfikowanie tego obiektu.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez polymorphism » środa, 4 marca 2009, 20:47

Możesz zrobić tak, że wątek dodaje do kolejki FIFO każdy pobrany z bazy wpis. Po stronie list view, timer pobiera dane z kolejki i dodaje je do kontrolki. Operacje dodawania i pobierania danych z kolejki muszą być zsynchronizowane (chociażby sekcjami krytycznymi).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » środa, 4 marca 2009, 21:12

bawiac sie synchronizacja za pomoca API nie potrzebuje posredniczacej kolejki. wtedy moge bezposrednio pracowac na kontrolkach. choc sam nie wiem jakby to dzialalo bo np klikniecie na jakims wierszu powoduje juz zmiane walasciwosci aktualnego indeksu itd...

wyglada na to ze w przypadku tych wizualnych komponentow VCL najlepsze jest przekazanie operacji do watku glownego ale wtedy sam watke w zasadzie traci polowe ze swojej szybkosci i jakosci ...

w jaki sposob wy realizujecie wypelnianie kontrolek wizualnych danymi w watkach? bo nie wierze ze dla duzej licznby danych zamrazacie aplikacje:). to samo dotyczy przetwarzania duzej liczny danych lezacych listbox czy listview i innych takich. musi byc watek zeby nie zamrozic aplikacji a 90%watku przekazywane do wwatku glownego daje efekt mierny. samo ProcessMessage() sie nie nadaje do takich operacji.

w dokumentacji wycztyalem ze komponenty data access np ADO sa bezpieczne dla watkow wiec wyciagajac te fragmenty poza Synchronize calosc jakos idzie ale nie jest to calkiem niezauwazalne.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez polymorphism » środa, 4 marca 2009, 23:08

bawiac sie synchronizacja za pomoca API nie potrzebuje posredniczacej kolejki.

No ale wtedy będziesz miał dokładnie to samo co TThread::Synchronize, tylko po swojemu 8-)

w jaki sposob wy realizujecie wypelnianie kontrolek wizualnych danymi w watkach?

Nie wypełniam... A jeśli już, wyglądałoby to tak, jak napisałem.

to samo dotyczy przetwarzania duzej liczny danych lezacych listbox czy listview i innych takich.

Do bardzo dużej liczby elementów listview ma tryb wirtualny.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » czwartek, 5 marca 2009, 02:10

mozesz napisac cos wiecej na temat tego trybu wirtualnego?

nigdy tego nei stosowalem i szczerze nie bardzo wiem jak mozna to tutaj zastosowac. tutaj czyli dla sytuacji gdy do listy chce wrzucic duzo danych. przecierz jesli przepisauje dane z dataset to nawet uzywajac trybu wirtualnego musze gdzies te dane przepisac... a puzniej z tego miejsca pobierac do listy zgodnie z numerem zadanego rekordu.
jak juz napisalem nigdy tego nei stosowalem i nie mam na ten temat praktycznej wiedzy wiec bardzo prosze o jakies wskazowki co to tego mechanizmu.

poczytalem troche o tym i wyglada na to ze w moim przypadku nie ma to zastosowania(moge sie mylic)
wnioskuje ze mechanizm ten sluzy temu ze mam dane np vectorze i chce my wizualizowac wiec aby nie przepisywac calosci do listy i trzymac te dane i w vectorze i w liscie to trzymamy tylko w vectorze a w liscie pokazuje tylko to co aktualnie chcemy.

jesli ja pobieram dane z bazy to chce je wyciagnac z datasetu i ten dataset zamknac. w tej sytuacji jedynym pojemnikiem na te dane bedzie lista wiec tryb wirtualny odpada. jesli zle to zrozumialem to bardzo prosze o sprostowanie mojego myslenia.

--------------------

mam jeszcze takie pytania:
skoro odwolania do obiektow VLC musza byc w Synchronize to czy odpolanie do obiektu AnsiStrign tez musi tam byc? np mam zmienan prywatna typu AnsiString w klasie watku i w Execute cos jej przypisuej to owe przypisanie musi byc w Synchronize czy nie?

druga sprawa jest taka, jesli w watku wypelniam zawartosc listview to jak moge na beizaco widzie ta zawartosc? refresh czy invalidate dle listy nie pomaga.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez polymorphism » czwartek, 5 marca 2009, 11:26

poczytalem troche o tym i wyglada na to ze w moim przypadku nie ma to zastosowania(moge sie mylic)

Szczerze mówiąc nie wiem, co ty chcesz osiągnąć. Chcesz wypełnić listview danymi z bazy bez blokowania aplikacji. Ale jak rozumieć to "bez blokowania"? Chodzi o to, że aplikacja ma być dostępna dla użytkownika w tym czasie, czy może o to, żeby okna były odświeżane, jeśli zajdzie taka potrzeba, choć użytkownik w tym czasie nie może nic zrobić, musi czekać?

jesli ja pobieram dane z bazy to chce je wyciagnac z datasetu i ten dataset zamknac. w tej sytuacji jedynym pojemnikiem na te dane bedzie lista wiec tryb wirtualny odpada.

A co za różnica co będzie pojemnikiem dla danych? Operując na zewnętrznym kontenerze masz większą kontrolę nad sposobem dodawania elementów. Koszt dodania elementu w trybie wirtualnym po stronie listview sprowadza się do powiadomienia kontrolki o aktualnej liczbie elementów w kontenerze, co nie zawsze musi skutkować odrysowaniem całego widoku - a to, jakby nie patrzeć, jest szybsze.

skoro odwolania do obiektow VLC musza byc w Synchronize to czy odpolanie do obiektu AnsiStrign tez musi tam byc

Jeśli oba wątki korzystają z tego samego obiektu, to tak, musisz synchronizować. Tylko mała uwaga, Synchronize przekazuje wykonanie metody wątkowi głównemu, przez co odwołania do VCL-owkich kotrolek są bezpieczne. W przypadku wszelkich odwołań do zmiennych takich jak AnsiString, można użyć zwykłych sekcji krytycznych. Synchronize stosuj tylko w przypadku odwołań do okien lub wtedy, gdy nie masz pełnej kontroli nad tym, co w danej chwili może mieć dostęp do zmiennej.

druga sprawa jest taka, jesli w watku wypelniam zawartosc listview to jak moge na beizaco widzie ta zawartosc? refresh czy invalidate dle listy nie pomaga.

Przy dodawaniu w sposób typowy, czyli po jednym elemencie, kontrolka powinna odświeżać widok na bieżąco, ale jeśli nie robi tego przy wypełnianiu w wątku, odpowiedź prosta - nie wypełniaj w wątku 8-)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » czwartek, 5 marca 2009, 17:28

chcesz wypelnic liste w watku! dlatego bo uzytkownik czekajac na zapelnienei sie listy moze przegladac np inna juz wyeplniana liste badz wykonywac inne czynnosci w palikacji.

w moim przypadku dataset nie moze "robic za" pojemnik na te dane poniewaz aby osiagnac maksymalna szybkosc dzialania z tym zbiorem ma on ustawiony kursor po stronie serwera i jest to kursor typu forwardonly. co za tym idzinie nie moge nawet odczytac ile jest elementow w datasecie, nie moge skakac do dowolnego elementu itd...

Przy dodawaniu w sposób typowy, czyli po jednym elemencie, kontrolka powinna odświeżać widok na bieżąco, ale jeśli nie robi tego przy wypełnianiu w wątku, odpowiedź prosta - nie wypełniaj w wątku 8-)

ta odpowiedz mnie nie satysfakcjonuje:P
wykozystanie watku w tej sytuacji wydaje mi sie calkiem naturalne i jesli cos nie gra idealnie od samego poczatku nie zanczy ze odrazu tzreba obchodzic to inaczej:)
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez polymorphism » czwartek, 5 marca 2009, 19:25

w moim przypadku dataset nie moze "robic za" pojemnik

A kto mówi, że ma robić za pojemnik?

jesli cos nie gra idealnie od samego poczatku nie zanczy ze odrazu tzreba obchodzic to inaczej:)

Ale czasem trzeba. W dokumentacji masz napisane jak wół, że wszelkie odwołania do VCL'owskich kontrolek powinny być zsynchronizowane, ponieważ biblioteka ta nie jest thread-safe. I ta informacja powinna ci wystarczyć. Wszelkie kombinowanie i udawanie, że bez synchronizacji jednak da się to zrobić, wcześniej czy później skończy się błędami występującymi od czasu do czasu i w dziwnych miejscach.




P.S. O jakich ilościach danych mówimy?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » czwartek, 5 marca 2009, 20:03

w oficjalnym podreczniku uzytkownika pisze rowniez ze kontrolki typu data access (w tym ADO) sa thread-safe! wiec polowa tej petli wylatuje z synchronize i zostaje samo wpisanie do listy. efekt taki ze to zlecenie przypisania do listy w watku glownym jest w zasadzie nie zauwazalne. to w sumie rozwiazauje moj problem.

jesli sytuacja nie dopuscilaby aby cos wyciagnac poza synchronize to faktycznie twoje rozwiazanie bylo by godne rozwazenia.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » piątek, 13 marca 2009, 01:25

finalnie jednak skozystalem z twoich propozycji. dataset zapisuje w watku do vectora co wykonuje sie bardzo szybko (10000rekordow na sekunde), a nastepnie wizualizuje wektor lista w trybie wirtualnym. calosc spisuje sie bardzo ladnie:).

thx za podsuniecie rozwiazania.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez polymorphism » piątek, 13 marca 2009, 11:46

Oczywiście pamiętałeś o sekcjach krytycznych?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: przepisywanie danych z dataset do widoku listy w watku

Nowy postprzez banita » piątek, 13 marca 2009, 15:53

zastosowalem bardziej rozbudowany mechanizm opracowany przez J.Richtera ktory jest autorytetem dla programistow windows. mozna powiedziec ze sa to sekcje krytyczne ze tym ze daja dwie mozliwosci pozyskiwania zasobu. na wylacznosc czyli do zapisu i jako zasob rownoczesnie wspoldzielony ale tylko do odczytu.

w niektorych przypadkach w zasadzie ejstem pewien ze obylo by sie bez synchronizacji ale zastosowalem tam zwykle sekcje.
sa to sytuacje gdy komunikacja z danym wektorem odbywa sie tylko w dwoch miejsca w programie: zapis w watku i odczyt w OnDraw listy, z tym ze mam pewnosc ze to zdarzenie listy nie bedzie wywolane dopuki dziala watek... ale chyba lepiej byc przezornym:P
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości

cron