[Borland C++ Biulder 6] Programowanie wielowątkowe

0

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)

0

nie doczytalem sie wszystkiego ale masz cos stasiu takiego jak nie uruchamianie innych watkow z innego watku jeszcze przy usuwaniu tamtego watku.

Inaczej
masz petle ktora sprawdza ktory watek zostal zamikniety i wtedy nastepny jest wykonywany
ale w glownym watku aplikacji

0

Po co stosować wątki skoro i tak wymuszasz sekwencyjną kolejność ich wykonywania?
To tak jakby wsiadać do ciężarówki, by dojechać do sąsiada, który mieszka od ciebie 15 metrów.

0

autor@stopka: devc++programmer? fajnie. ale wiesz ze ma walniety kompilator?:)

0

Podaj jeszcze ciało wątku i kod który dodaje nowe zadania. Od razu dorzuć ciałko klasy Proces bo może się przydać.
Owa "długość" zmniejsza się wraz z działaniem wątku?

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