witam
Probuje rozwiazac nastepujacy problem, ktos pomoze?
Mamy 3 klasy.
Pierwsza klasa to klasa DataSource, posiada ona jedna metode getData(), zwraca liczbe int co jakis losowy odcinek czasu.
Jej wywolanie powoduje równiez zablokowanie watku w, którym zostanie wywolana. Pseudokodem mozna ja opisac tak:
int getData()
{
sleep(rand()%255);
return rand()%N;
}
Druga klasa to klasa Reciever, na jej potrzeby dziala watek, który jest niezalezny od watku glownej aplikacji.
Klasa ta odbiera dane z DataSource, a nastepnie wrzuca je do kolejki. Mozna ja opisac w ten sposób:
void ThreadFunc()
{
while (true)
list.Insert(DataSource.getData());
}
Trzecia klasa posiada natomiast rózne metody, ktorych reakcja powinna byc uzalezniona od obecnosci odpowiednich
elemtnow w liscie z klasy Reciever. Programista powinien wywolywac funkcje z klasy trzeciej,
funkcje te powinny czekac w sposób NIEAKTYWNY na obecnosc elementu w liscie.
Jezeli dany element sie pojawi powinny wykonac odpowiednie operacje.
Rozwiazania, które mi nie odpowiada:
Najprosciej byloby zrobic delegacje i eventy w klasie Reciever, odbierac dane z klasy DataSource,
nastepnie wywolywac odpowiedni event na podstawie otrzymanego numerku. Takie rozwiazanie jednak
zmienia troche filozofie calego ukladu. programista musi podstawiac funkcje pod eventy z klasy Reciever,
a ja CHCE tak aby programista wywolywal funkcje z klasy trzeciej, ta funkcja zaczekala na element
w liscie a nastepnie zwrócila mu jakis wynik.
Rozwiazanie, które przyszlo mi do glowy:
Zrobic w klasie Reciever tablice kolejek, której elementy bede stanowic semafory dla danej
funkcji z klasy trzeciej. tablica bedzie miala rozmiar 1..N. Kiedy jakas funkcja z klasy trzeciej
bedzie chciala zaczekac na jakis element, doda sie do odpowiedniej kolejki pod odpowiednim
indeksem tablicy - doda semafor, który na poczatku bedzie zablokowany.
Nastepnie funkcja w klasie trzeciej zrobi semafory[M][Z].wait(), natomiast klasa Reciever,
kiedy przyjdzie element o numerku M zrobi semafory[M][Z].signal(), tak aby odblokowac wszystkie
semafory tyczace sie danego elementu i funkcje oczekujace na element rusza z dzialaniem.