W

Potrzebujesz pomocy z C, C++, perl, python, itp.
szarpi
Posty: 1
Rejestracja: 17 kwietnia 2011, 13:53

Wątki i semafory w C

Post autor: szarpi »

Witam.
Mam do napisania pewien program oparty na wątkach, opiszę go w skrócie. Chodzi o filtrowanie wczytanego przez użytkownika obrazu, mam do zrobienia kilka filtrów, każdy w osobnym wątku i każdy ma działać na własnej kopii obrazka a potem wczytywać (po kolei) do wątku głównego i wyświetlać poszczególne filtry. Powiedzmy, że mam na to pomysł, problem jest w tym, że program ma również reagować na to co robi użytkownik, tzn. jeśli jest w trakcie filtrowania jakiegoś obrazka, a użytkownik wpisze już nową nazwę, to program ma przerwać filtrowanie i zacząć filtrować nowy obrazek. jeśli obraz zdąży się przefiltrować to czeka aż użytkownik poda nową nazwę. Potrzeby jest do tego jakiś wątek nadzorujący. W związku z tym moje pytanie brzmi, w jaki sposób (nie znalazłem żadnej funkcji) zrobić aby można było wątek uruchomić od nowa (bez zabijania go i tworzenia od nowa). Wymyąliłem, że wątek nadzorujący wyglądałby mniej więcej tak:

Kod: Zaznacz cały

void nadzor(char nazw[100])
{
 char tmp[100] = nazw;
 while(1)
 {
  if(strcmp(tmp,nazw) != 0)
  {
   //tu wlasnie musze zrobic cos aby watki startowaly od nowa//
   tmp = nazw;  
  }
 }
}
 

Ma to działać tak, że wątek cały czas będzie sprawdzał zmienną nazwę (zmienna globalna, wprowadzona przez użytkownika) i jeśli ulegnie zmianie to uruchomi ponownie wątki, do tmp przypisze nową nazwę i znów to samo.

Wątki z filtrami napisałem w ten sposób:

Kod: Zaznacz cały

void *filtr1(void *mem)
{
 
 while(1)
 {
  //tworzy wlasna kopie obrazka
  char *tab;
  tab = (char *)malloc(filesize*sizeof(char));
 
  memcpy(tab,p,filesize);
 
  //tu bedzie jakis filtr
 
  //////////////////////
 
  //filtr1
 
  //////////////////////
 
  //zapisuje przefiltorwany obraz do pamieci
  //zastosuje mutexy aby watki nie zapisywaly do wspolnej pamieci jednoczesnie
 
  pthread_mutex_lock(&mut1);
 
  memcpy(p,tab,filesize);
 
  pthread_mutex_unlock(&mut1);
 
  //zwalnia pamiec usuwajac swoja kopie obrazka
  free(tab);
  //oczekiwanie watku
  sem_init(&s1,0,0);
  sem_wait(&s1);
 }
}
 
void *mem jest nieużywane, p to wskaźnik do mapowanej pamięci w wątku głównym.

Mam nadzieję, że wszystko jasno opisałem.
kudlat9
Posty: 12
Rejestracja: 03 maja 2011, 20:47

Post autor: kudlat9 »

Witam.
Mam do napisania pewien program oparty na wątkach, opiszę go w skrócie. Chodzi o filtrowanie wczytanego przez użytkownika obrazu, mam do zrobienia kilka filtrów, każdy w osobnym wątku i każdy ma działać na własnej kopii obrazka a potem wczytywać (po kolei) do wątku głównego i wyświetlać poszczególne filtry. Powiedzmy, że mam na to pomysł, problem jest w tym, że program ma również reagować na to co robi użytkownik, tzn. jeśli jest w trakcie filtrowania jakiegoś obrazka, a użytkownik wpisze już nową nazwę, to program ma przerwać filtrowanie i zacząć filtrować nowy obrazek. jeśli obraz zdąży się przefiltrować to czeka aż użytkownik poda nową nazwę. Potrzeby jest do tego jakiś wątek nadzorujący.
W przypadku gdy dany wątek jest zajęty generowaniem filtru, a użytkownik wprowadził nowe dane musisz go o tym poinformować wysyłając mu sygnał np.:

Kod: Zaznacz cały

 HUP
za pomocą

Kod: Zaznacz cały

pthread_kill
W wątku musisz napisać odpowiednią procedurę obsługi tego sygnału (czyli np. w przypadku wystąpienia tego komunikatu przerywam daną operacje, robię przeładowanie danych i zaczynam generowanie filtru na nowych danych itp.). Dany sygnał w wątku musisz zamaskować za pomocą:

Kod: Zaznacz cały

pthread_sigmask

Podręczniki systemowe dostarczą odpowiednich przykładów kodów źródłowych.

Pozdrawiam
Kudlaty
ODPOWIEDZ