Witam
Mam kilka wątków zgromadzonych na liście (TList *lista), każdy wątek ma ustalony z góry czas wykonywania(int dlugosc), która sie zmienia z postępem wykonywania wątku. w miarę upływu czasu przybywają kolejne wątki.
Uruchamiam pierwszy, po jego zakończeniu chcę żeby następny był najkrótszy na liście(założenie:pracuje zawsze tylko jeden watek). do tego momentu działa bez problemu.
chciałem zmodyfikować program żeby pracował zawsze najkrótszy na liście, jeżeli przyjdzie nowy krótszy od obecnego ten powinien zostać zatrzymany a uruchomiony najkrótszy(coś jak wywłaszczenie), jednak po zakończeniu najkrótszego(nowego) nie uruchamia sie następny wg zasady najkrótszy z listy najpierw.
Funkcja końca wątku:
Proces *p=0;
int min=0;
// ...
void __fastcall TFrame2::MyOnTerminate(TObject *Sender) //gdy watek dobiega konca
{;
if(lista->Count-1!=0) //jezeli sa jeszcze jakies watki to zaladuj kolejny
{
lista->Delete(min);
Proces *a=0,*b=0;
min=0;
for(int i=0;i<lista->Count;i++)
{
a=(Proces *)lista->Items[i];
b=(Proces *)lista->Items[min];
if((a->dlugosc < b->dlugosc))
min=i;
}
p=(Proces *)lista->Items[min];
p->OnTerminate=MyOnTerminate;
p->Resume();
}
else //jezeli brak watkow zakoncz
{
Memo1->Lines->Add("Koniec");
}
}
Przykład:
Pracuje wątek najkrótszy w1 o dł. 60. przychodzi w2 o dł. 40.
w1 zatrzymaj
p->Suspend();
(znajdz najkródszy i podstaw do *p)
w2 uruchom
p->Resume();
jak w2 sie skończy postępuj jak w funkcji MyOnTerminate(TObject *Sender).
funkcja wybierająca test podobna jak MyOnTerminate z tym ze występuje jeszcze p->Suspend() przed pętlą.
co jest tego powodem i jak to poprawić? :-/
Gdzie umieścić funkcję sprawdzania długości? (obecnie jest pod przyciskiem)