- 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.