Witam ponownie po przerwie i chciał bym powrócić do tematu wątku i komponentów wizualnych VCL.
Kwestia jest następująca - "do wątku" przekazuje wskaźnik na TListView który to zawieraj np kolumnę [Adresy URL] do wykonania na nich operacji i kolumnę [Status Operacji] która jak sama nazwa wskazuje ma pokazywać na bieżąco status operacji jak logowanie, wyszukiwanie, dodawanie itd,,,
Sprawa jest prosta jak dane czasochłonne operacji wykonywane były bezpośrednio w metodzie MyWatek::Execute() wtedy mogę użyć metody Synchronize
// Wywolanie watku z Formy Glownej programu
Watek = new MyWatek(true);
Watek->WT_ListView1 = ListView1;
Watek->OnTerminate = MyOnTerminate;
Watek->Resume();
// Watek roboczy MyWatek
void __fastcall MyWatek::Execute()
{
this->sKomunikat="Start";
Synchronize(&KomunikatZwrotny);
Sleep(RandomRange(5000, 10000));
this->sKomunikat="Pobieram";
Synchronize(&KomunikatZwrotny);
Sleep(RandomRange(5000, 10000));
this->sKomunikat="Operacja 1";
Synchronize(&KomunikatZwrotny);
Sleep(RandomRange(5000, 10000));
///itd.... co symuluje czasowe operacje wykonywane w metodzie Execute() watku
}
void __fastcall MyWatek::KomunikatZwrotny()
{
WT_ListView1->Items->Item[this->tuNrNaList]->SubItems->Strings[0] = this->sKomunikat
}
Wersja z klasą roboczą wywoływaną w wątku:
/// WERSJA DRUGA Z KLASA OBSLUGI OPERACJI WYWOLYWANA W WATKU
void __fastcall MyWatek::Execute()
{
KlasaRobocza * DoKlasaRobocza = new KlasaRobocza();
DoKlasaRobocza->KL_ListView1 = WT_ListView1;
DoKlasaRobocza->KL_NrNaList = tuNrNaList;
DoKlasaRobocza->WykonujOperacje();
delete DoKlasaRobocza; KlasaRobocza = NULL;
}
// W klasie roboczej mamy metode
void __fastcall KlasaRobocza::WykonujOperacje()
{
KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] = "Start";
Sleep(RandomRange(5000, 10000));
KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] ="Pobieram";
Sleep(RandomRange(5000, 10000));
KL_ListView1->Items->Item[this->KL_NrNaList]->SubItems->Strings[0] ="Operacja 1";
Sleep(RandomRange(5000, 10000));
///itd.... co symuluje czasowe operacje wykonywane w metodzie WykonujOperacje
}
Te komunikaty sie pojawiają w ListView i porgram się nie wysypuje (choć wątków działa wiele naraz), ale jak sadzę nie ma tu żadnej synchronizacji.
Jak to zrobić prawidłowo Czyli jak zablokować na chwilę dostęp dp VCL ListView by mógł tylko jedne watek

KlasaRobocza w nim wywolywa odwołać się do ListView ?
-----
Podsumowując chodzi o to żeby był jeden wątek który w zależności od zadania do wykonania wywoływał rożne "klasy robocze"w metodzie Execute() i by klasy robocze mogły "wypisywać" na bieżąco status wykonywanej operacji w TListView, a nie tylko po zakończeni komunikat zwrotny.