lista wątków, tablica wątków problem z implementacją.

0

Witam,
forumowicze potrzebuję podpowiedzi na czym oprzeć mechanizm przetrzymywania wątków, czy użyć do tego celu tablicy tab: array of TMojWatek; czy np. klasy Tlist czy może innych, lub też są może inne metody ? chodzi też o to że nie mam z góry zdefiniowanej ilości wątków ich ilość zależy od ilości danych wejściowych,
mam nadzieje że w miarę jasno przedstawiłem mój problem, bardzo proszę o wypowiedzi.
Pozdrawiam.

0

hm... tak na zimno to bym polecił dynamiczną tablicę wskaźników do tych wątków, niby można byłoby zrobić tablicę wątków ale ja bym nie próbował merdać w tablicy w której siedzą coś sobie robiące wątki =D

0

w tablicy nie siedzą wątki, tylko ich adresy, a z tymi możesz robić, co ci się żywnie podoba. TThread to wskaźnik. Class to wskaźnik sam w sobie.
lista jest niepotrzebna, tablica wydaje się najsensowniejszym rozwiązaniem.

0
keinxor napisał(a)

Witam,
forumowicze potrzebuję podpowiedzi na czym oprzeć mechanizm przetrzymywania wątków, czy użyć do tego celu tablicy tab: array of TMojWatek; czy np. klasy Tlist czy może innych, lub też są może inne metody ? chodzi też o to że nie mam z góry zdefiniowanej ilości wątków ich ilość zależy od ilości danych wejściowych,
mam nadzieje że w miarę jasno przedstawiłem mój problem, bardzo proszę o wypowiedzi.
Pozdrawiam.

<ort>Woglóe </ort>nie musisz tworzyć struktur wątków. stwórz tak klase wątku tak, by wyparował po wykonaniu (FreeOnTerminate=True) a nastepnie stworz odowiednia ilosc watkow przekazujac im odpowiednie parametry.
Przyklad.zalozmy ze jest do przetworzenia jakas tablica Tab o rozmiazre dajmy na to 1000. Wowczas rozbice tego na 4 wątki mogłoby wglądać jakoś tak:

  constructor TMojWatek.Create( var pTab: TTab,  IStart, IEnd: Integer; var pKoniec: Boolean)
   begin
      //...
   end;

   procedure TMojWatek.Execute;
    begin
      FreeOnTerminate:=True;
      //tu kod przetwarzajacy fragment tablicy od IStart do IEnd
    end;

procedure PrzetworzTabNa4Procki;
begin

  //Twórz watki przekazujac kazdemu "zakres obowiazkow" 
  TMojWatek.Create( Tab, 0, 249,  Koniec1)
  TMojWatek.Create( Tab, 250, 499, Koniec2)
  TMojWatek.Create(Tab, 500, 749, Koniec3)
  TMojWatek.Create(Tab, 750, 999, Koniec4)
 
  //Poczekaj
 repeat
   Sleep(KrootkiOkres)
 until Koniec1 and Koniec2 and Koniec3 and Koniec4

 //zrobione
end;

można teraz powyższy kod zmodyfikować, np napisac procedurę ktora w petli tworzy zadaną ilosc watkow

   procedure PrzetworzTabNaKilkaProckow( IleProckow: Integer );
   var
      Koniec: array of Boolean;
   begin
      SeLength( Koniec, IleProckow );
      //Koniec[i]:=False
      for i:=0 to IleProckow-1  do
         begin
            //tu kod wyliczajacy IStart IStop
            TMojWatek.Create( Tab, OdpowiednioWyliczonyIStart, OdpowiednioWyliczonyIStop, Koniec[i] );
          end;
      // tu kod oczekujacy na wszystkie elementy tablicy Koniec=True
   end;
0

Witam,
bardzo dziękuję "tuNadlatujoncyQubek", za informację a w zasadzie za uświadomienie i ten kawałek koduTMojWatek.Create( Tab, OdpowiednioWyliczonyIStart, OdpowiednioWyliczonyIStop, Koniec[i]
nie wiedziałem że w ten sposób można tworzyć wątki, ja miałem zmienną typu TMojWatek ta stqandardowo moja_zmienna:=TMojWatek.Create(.....);
jeszcze raz bardzo dziękuję i pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1