Synchronizacja dla wątków
Napisane: środa, 29 września 2010, 19:10
Witam ponownie,
wiec jest taki problem - w głównym oknie programu jest komponent TListView zawierający listę listę no 2000 adresów stron na które powinny zastać wywołane w celu pobrania z nich kodu HTML do jakieś operacji na nim. Żądania HTTP metodą GET realizuje za pomocą INDY w w pętli w wątku przykładowo:
I teraz problem polega jak uruchomić kolejne takie wątki i je zsynchronizować by następny wątek nie pobierał od zera, ale ostatniego nieodwiedzonego adresu na liście TListView czyli żeby odwiedzone adresy były pomijane.
Pozdrawiam
wiec jest taki problem - w głównym oknie programu jest komponent TListView zawierający listę listę no 2000 adresów stron na które powinny zastać wywołane w celu pobrania z nich kodu HTML do jakieś operacji na nim. Żądania HTTP metodą GET realizuje za pomocą INDY w w pętli w wątku przykładowo:
KOD cpp: UKRYJ
void __fastcall MyWatek::PobierzStart()
{
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[0] = "Start...";
this->Edit1->Text = this->odwiedzony + 1;
this->Start = GetTickCount();
}
//---------------------------------------------------------------------------
void __fastcall MyWatek::Execute()
{
this->nrNaListViev = 0;
TIdHTTP *IdHTTP1 = new TIdHTTP(NULL);
for(int jj = 0; jj < ListView1->Items->Count; jj++)
{
this->nrNaListViev = jj;
this->zadanyUrl = ListView1->Items->Item[jj]->Caption;
Synchronize(&PobierzStart);
try
{
IdHTTP1->HandleRedirects = true;
IdHTTP1->ConnectTimeout = 5000;
IdHTTP1->ReadTimeout = 5000;
IdHTTP1->AllowCookies = true;
this->kodHtml = Utf8ToAnsi(IdHTTP1->Get(this->zadanyUrl));
this->kodHttp = IdHTTP1->ResponseText;
Synchronize(&PobierzStop);
}
catch(EIdSocketError &e)
{
this->kodHttp = e.Message.Trim();
Synchronize(&PobierzStop);
}
catch(Exception &exception)
{
this->kodHttp = exception.Message;
Synchronize(&PobierzStop);
}
}
delete IdHTTP1; IdHTTP1 = NULL;
}
//---------------------------------------------------------------------------
void __fastcall MyWatek::PobierzStop()
{
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[0] = this->kodHttp;
this->End = GetTickCount();
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[1] = FloatToStr((this->End - this->Start) / 1000) + " s.";
}
{
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[0] = "Start...";
this->Edit1->Text = this->odwiedzony + 1;
this->Start = GetTickCount();
}
//---------------------------------------------------------------------------
void __fastcall MyWatek::Execute()
{
this->nrNaListViev = 0;
TIdHTTP *IdHTTP1 = new TIdHTTP(NULL);
for(int jj = 0; jj < ListView1->Items->Count; jj++)
{
this->nrNaListViev = jj;
this->zadanyUrl = ListView1->Items->Item[jj]->Caption;
Synchronize(&PobierzStart);
try
{
IdHTTP1->HandleRedirects = true;
IdHTTP1->ConnectTimeout = 5000;
IdHTTP1->ReadTimeout = 5000;
IdHTTP1->AllowCookies = true;
this->kodHtml = Utf8ToAnsi(IdHTTP1->Get(this->zadanyUrl));
this->kodHttp = IdHTTP1->ResponseText;
Synchronize(&PobierzStop);
}
catch(EIdSocketError &e)
{
this->kodHttp = e.Message.Trim();
Synchronize(&PobierzStop);
}
catch(Exception &exception)
{
this->kodHttp = exception.Message;
Synchronize(&PobierzStop);
}
}
delete IdHTTP1; IdHTTP1 = NULL;
}
//---------------------------------------------------------------------------
void __fastcall MyWatek::PobierzStop()
{
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[0] = this->kodHttp;
this->End = GetTickCount();
ListView1->Items->Item[this->nrNaListViev]->SubItems->Strings[1] = FloatToStr((this->End - this->Start) / 1000) + " s.";
}
I teraz problem polega jak uruchomić kolejne takie wątki i je zsynchronizować by następny wątek nie pobierał od zera, ale ostatniego nieodwiedzonego adresu na liście TListView czyli żeby odwiedzone adresy były pomijane.
Pozdrawiam