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