CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Synchronizacja dla wątków

Synchronizacja dla wątków

dział ogólny

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 21:51

Teraz to Ty już kręcisz. Podałeś przykład przekazywania obiektu ListView do wątku, a ja dodałem identyczny sposób przekazywania zmiennej. Wystarczy tą zmienną wykorzystać do zmiany początku przeszukiwania listy.

ale ostatniego nieodwiedzonego adresu na liście TListView czyli żeby odwiedzone adresy były pomijane.


Wartość tej zmiennej to właśnie ostatni nieodwiedzony adres na liście. Każdy nowy wątek, nie musi zaczynać od 0, lecz od wartości tej zmiennej. Więc jak najbardziej na temat.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Darek_C++ » środa, 29 września 2010, 21:56

Tylko że to nadal nie rozwiązując tej kwestii o jaką chodziło.
1 Wątek pobiera adres this->zadanyUrl = ListView1->Items->Item[0]->Caption;
2 Wątek pobiera adres this->zadanyUrl = ListView1->Items->Item[1]->Caption;
3 Wątek pobiera adres this->zadanyUrl = ListView1->Items->Item[2]->Caption;
itd i co dalej przy kolejnych obiegach pętli zwiększać zmienną o 3... Już dziś nie myślę, bo zmęczony jestem :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 22:02

Jakie pytanie taka odpowiedź. Tobie nie chodziło o początek lecz koniec listy...
Czyli dajmy na to pierwszy wątek sprawdza adresy z listy i doszedł np. do 10 pozycji, teraz uruchamiasz drugi wątek i chcesz by zaczął przeszukiwanie od 11 pozycji, itd... O to chodzi? Jeżeli tak to nie bardzo rozumiem co robi pierwszy wątek skoro drugi przejmuje jego funkcję, zakładając że drugi wątek zaczyna dokładnie od miejsca w którym skończył pierwszy. Pomijając tą kwestię, jeżeli chodzi o takie rozwiązanie, to postępujesz podobnie jak to opisałem, ale zmienna w klasie formularza jest zbędna, wystarczy zmienna w klasie wątku. Wątek po pobraniu każdego adresu z listy musi ustawić wartość tej zmiennej na numer pozycji listy. Drugi tworzony wątek sprawdza jaką wartość ma ta zmienna w pierwszym wątku i taką wartość sobie ustawia, czyli:

KOD cpp:     UKRYJ  
Watek1 = new MyWatek(true);
Watek1->ListView1 = ListView1; // przekazuje jako pole klasy watku
Watek1->nr = 0;
// Dalszy kod

Watek2 = new MyWatek(true);
Watek2->ListView1 = ListView1; // przekazuje jako pole klasy watku
Watek2->nr = Watek1->nr + 1;
// Dalszy kod

Watek3 = new MyWatek(true);
Watek3->ListView1 = ListView1; // przekazuje jako pole klasy watku
Watek3->nr = Watek2->nr + 1;
// Dalszy kod
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 22:05

No tak, Tobie jednak chyba chodzi o coś zupełnie innego... Uruchamiasz wszystkie trzy wątki i chcesz, żeby każdy pobierał inną wartość z listy, by się nie powtarzały. To akurat ma sens. Tylko, że od razu powinieneś tak zadać pytanie. Zastanowię się, bo akurat na to nie mam pomysłu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 22:10

Może takie rozwiązanie. Każdy wątek po pobraniu adresu z listy, usuwa ten element z listy, w ten sposób żaden wątek nie może pobrać tego samego adresu, gdyż raz pobrana pozycja znika z listy.

Zastanawia mnie jednak co innego. Skoro rzutujesz jeden obiekt ListView na trzy watki, to pojawia się problem, gdyż jedne obiekt nie może być w tym samym czasie trzykrotnie rzutowany.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Darek_C++ » środa, 29 września 2010, 22:23

Ja to robię w ten sposób jak już pisałem wcześniej:
"Kwestię rozwiązałem za pośrednictwem wizualnego komponentu Edit1 który zawiera startowa wartość -1 do którego watek ma dostęp bo przekazuje je jako pole klasy wątku. Następnie w wątku w metodzie wywoływanej na początku kolejnego przebiegu pętli MyWatek::PobierzStart() odczytuje wartość, zwiększam o jeden i zapisuje powrotem w Edit1. Ten problem z pewnością ma wiele rozwiązań, ale ten działa zgodnie z oczekiwaniem wiec chyba wystarczy :)"
Kod: Zaznacz cały
void __fastcall MyWatek::PobierzStart()
{

   this->odwiedzony = StrToInt(Edit1->Text) ;
   ++this->odwiedzony;
   this->Edit1->Text = this->odwiedzony;

   this->zadanyUrl = ListView1->Items->Item[this->odwiedzony]->Caption;
   ListView1->Items->Item[this->odwiedzony]->SubItems->Strings[0] = "Start...";
   this->nrNaListViev = this->odwiedzony;
   Memo1->Lines->Add((String)this->odwiedzony+" ->"+ this->zadanyUrl);
   this->Start = GetTickCount();
}
//
void __fastcall MyWatek::Execute()
{


    while(1)
    {
        if(this->odwiedzony >= ListView1->Items->Count)
        {
          break;
        }
// Dalszy kod pobierajacy dane


Musze kończyć - dziękuje za poświęcony czas.
8-)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 22:30

Tylko wciąż nie rozumiem dlaczego używasz komponentu Edit, skoro możesz użyć zamiast niego zmiennej. Przecież nie używasz całego komponentu Edit, a tylko jego właściwości tekst do przechowywania wartości. Właściwość Text obiektu Edit jest typu AnsiString (lub UnicodeString), więc rozwiązanie nasuwa się samo. Zamiast obiektu Edit użyj zmiennej String. Poza tym przechowujesz w tej zmiennej liczbę, więc zamiast typu String możesz użyć typu int.

KOD cpp:     UKRYJ  
int edit; // deklaracja zmiennej zamiast obiektu Edit.
//......
   this->odwiedzony = edit;
   ++this->odwiedzony;
   this->edit = this->odwiedzony;

// lub po prostu, bez odwiedzony:

this->edit++;
bo przekazuje je jako pole klasy wątku.


Przecież dokładnie tak samo możesz przekazać dowolną zmienną. Jaką widzisz różnicę w przekazywaniu całego obiektu a jednej zmiennej?! :o
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Cyfrowy Baron » środa, 29 września 2010, 23:03

Pomyślałem sobie, że może nie wiesz jak przekazywać wskaźnik na zmienną tak jak to robisz z Edit.
Tak więc w pliku formularza deklarujesz zmienną normalnie, czyli np:

KOD cpp:     UKRYJ  
private:
        int edit;


Natomiast w klasie wątku deklarujesz ją tak:

KOD cpp:     UKRYJ  
public:
        int *edit;


W formularzu przekazujesz wskaźnik do zmiennej w wątku tak:

KOD cpp:     UKRYJ  
Watek1->edit = &edit; /* gdzie &edit odnosi się do zmiennej formularza, która będzie wspólna dla wszystkich wątków, tak jak masz to z Edit1 */


w wątku wartość zmiennej musisz zmieniać tak:

KOD cpp:     UKRYJ  
void __fastcall MyWatek::PobierzStart()
{

   this->odwiedzony = *edit;
   ++this->odwiedzony;
   edit = &this->odwiedzony;

   this->zadanyUrl = ListView1->Items->Item[this->odwiedzony]->Caption;
   ListView1->Items->Item[this->odwiedzony]->SubItems->Strings[0] = "Start...";
   this->nrNaListViev = this->odwiedzony;
   Memo1->Lines->Add((String)this->odwiedzony + " - >" + this->zadanyUrl);
   this->Start = GetTickCount();
}


prościej będzie chyba jednak tak:

KOD cpp:     UKRYJ  
void __fastcall MyWatek::PobierzStart()
{
  ++*edit;

   this->zadanyUrl = ListView1->Items->Item[*edit]->Caption;
   ListView1->Items->Item[*edit]->SubItems->Strings[0] = "Start...";
   this->nrNaListViev = *edit;
   Memo1->Lines->Add((String)*edit + " - >" + this->zadanyUrl);
   this->Start = GetTickCount();
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja dla wątków

Nowy postprzez Darek_C++ » niedziela, 3 października 2010, 15:01

Dziś powróciłem do tego tematu i Twoja porada/sposób CB jest idealny - dziękuję .
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • 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 2 gości

cron