Aplikacje wielozadaniowe

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
Siemano wszystkim
smile.gif
otoż nasunęła mi się dzisiaj myśl w jaki sposób są tworzone aplikacje wielozadaniowe, np załóżmy ze wyposażymy nasza aplikacje w kilka funkcji, podczas robienia jednej funkcji, aplikacja zawiesza się, trzeba czekać aż funkcja się skończy, a DOBRZE WIEMY ze np aplikacje do pobierania plikow (nawet P2P) potrafią pobierać pliki, przeszukiwać bibliotekę plików, puscic podgląd ściąganego filmu i jeszcze cos tam i to wszystko naraz.

Czy ktoś wie coś na ten temat??
smile.gif
bardzo proszę o wszelkie podpowiedzi
<


POZDRAWIAM!
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
wątki np. funkcja CreateThread
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Alternatywą dla wątków są procesy, choć w takich przypadkach jak podałeś to raczej się nie uda. Wady i zalety obu rozwiązań widać w silnikach PostgreSQLa (procesy) i MySQLa (wątki) - to tak w skrócie, jakbyście chcieli to się rozpisze
smile.gif


PS wielozadaniowość, wielowątkowść, współbieżność i pokrewne tematy są świetnie opisane w książce "Podstawy systemów operacyjnych", Silberschatz A., Galvin P.B., Gagne G.
 

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
Grzonu, zainteresowałem sie Twoja propozycją, poczytałem trochę jednak nie potrafię jakoś tego użyć, wywala błąd :( Załóżmy ze mam procedure szukaj(haslo:string) i jakoś nie umiem jej wywołać funkcją CreateThread... Czy ktoś mogłby mi dać przyklad? :)

// widmo17 nie kupiłem mu piwka i nie kupie :p :D
POZDRAWIAM
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
funkcja ktora chcesz wywolac musi spelniac pewne normy np:

jej definicja to DWORD __stdcall func(PVOID pvParam);
pozatym funkcja MUSI cos zwracac

pokaz jak probojesz wywolac CreateThread
 

Legalnl

Użytkownik
Dołączył
Październik 8, 2008
Posty
828
Tylko sie nie smiej Grzonu jak bedzie zle :)

Kod:
prodcedure szukaj(wyrazenie:string);


CreateThread(nil, 0, szukaj('UltrasGS'), i, 0, wz);
i nie wiem czy mam dobrze (tzn wiem ze mam zle :D ) ale nie wiem co z tym zrobić
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
@widmo17
Wątki mają ten problem, że jeżeli jeden wątek wywali program (np. dojdzie do segmentation fallout) to cały proces pada, w modelu z procesami pada tylko ten jeden, błędny proces. Taką metodę przyjęto w postgresie, nowe połączenie do bazy = nowy proces, więc jeżeli okaże się był bug podczas wykonywania procesu, który to zajmuje się danym połączeniem, to proces pada, zaś silnik bazy danych działa dalej, pozostałe procesy obsługujące inne połączenia też. Kolejną zaletą użycia procesów jest to, iż łatwo je monitorować i kontrolować, przykładowo dajesz sobie ps aux | grep czesc-nazwy-procesu i widzisz jakie procesy on odpalił, ile zajmują pamięci, procesora, jaki mają stan. Jeśli aplikacja jest bardzo modularna to część z nich, które Ci nie pasują możesz ubić lub obniżyć im priorytet. Wadą procesów jest to, że ich obsługa (tzn. przełączanie się między nimi, ich tworzenie) jest bardziej czasochłonne. Swoją drogą to jest takie żartobliwe powiedzenie: od wielowątkowści psują się zęby :p
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
@RobertG ale np. do jednoczesnego odtwarzania filmu i np. sciaganie pliku nie bedziesz robil 2 procesow bo jest to niewygodne.

@legaln do CreateThread przekazujesz tylko ADRES funkcji a nie wywolujesz ja bo wtedy przekazane bedzie to co zwroci funkcja. Nastepny parametr to to co musi przyjac funkcja

Kod:
DWORD __stdcall ThreadProc(LPVOID pvParam)
{
//przykladowo przekazujemy do funkcji cos co ma sie prinfowac
printf("%s",pvParam);
return 0;
}

HANDLE h=CreateThread(0,0,ThreadProc,(LPVOID)"ala ma kota",0,0);
 
Do góry Bottom