• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Watki - jak to zrobić ?

Object Storage Arubacloud
0 głosów
519 wizyt
pytanie zadane 24 października 2015 w C i C++ przez Horace17 Obywatel (1,070 p.)
Witam, czy mógłby mi ktoś wytłumaczyć(z wykorzystaniem przykładów) jak wykonać wątki i synchronizacje między nimi  ? Potrzebuję wykonać program w konsoli, który będzie coś wyliczał i wypisywał(1 wątek) oraz czekał na odbieranie klawiszy strzałek w celu zwiększenia i zmniejszenia prędkości tego wypisywania w 1 wątku (2 wątek). Czy jest taka możliwość, żeby to zrobić w konsoli ? Czytałem na temat wątków, niestety pogubiłem się, nie wiem której biblioteki użyć, próbowałem z boost, jednak mam problemy z instalacją jej, próbowałem standardowej thread, jednak nie potrafię z niej wystarczająco korzystać, widziałem też parę innych, ale moim zdaniem nie potrzebuje jakoś bardzo rozbudowanej biblioteki do wykonania tego mojego prostego zadanka. Niestety mój język angielski nie jest świetny, więc czytanie i rozumiemie artykułów po angielsku sprawia mi ogromny problem, a mam do wykonania ten program do poniedziałku. Pozdrawiam !

2 odpowiedzi

+2 głosów
odpowiedź 24 października 2015 przez Rogargol Pasjonat (16,600 p.)
wybrane 24 października 2015 przez Horace17
 
Najlepsza
Mysle ze w tej sytuacji nie sa Ci potrzebne wątki. Oczywiscie mozesz sprobowac sie z tym babrac, ale to bedzie przerost formy nad trescia.

Uzyj pętli i zrob sobie funkcje ktora bedzie cos tam wypisywac i obliczac, a bedzie sie wlaczala w momencie jesli minie odpowiednia ilosc czasu. No i w petli bedziesz sprawdzal klawisze, a jesli zostanie wduszony odpowiedni klawisz to zwiekszysz limit czasu, lub go zmniejszysz.

Wystarczy ze zrobisz zmienna ktora przechowuje ostatni czas, zmienna ktora przechowuje ilosc czasu co jaki ma byc odpalona funkcja, no i ifa ktory bedzie sprawdzal czy aktualny czas jest wiekszy od ostatniego czasu plus czas co jaki ma byc wlaczona funkcja.

Do tego przyda Ci sie funkcja kbhit() ktora zwraca true jesli jest wcisniety klawisz i na tej podstawie bedziesz getch() sprawdzal jaki to klawisz bez blokowania pętli.

Jakbys czegos nie rozumial to wyjasnie.
komentarz 24 października 2015 przez Horace17 Obywatel (1,070 p.)
Mam problem ze zrozumieniem o co chodziło Ci z tym czasem, mógłbyś to bardziej rozwinąć ? Obecnie myślałem nad zastosowaniem kbhit() w ifie, w przypadku prawdy zmienna 'czas' zostaje zwiększona lub zmniejszona o pewną ilość , zmienna ta jest wykorzystywana przy funkcji Sleep(czas), która jest w pętli wypisującej wyniki. Jest to jakieś rozwiązanie ?
komentarz 24 października 2015 przez Rogargol Pasjonat (16,600 p.)

robisz tak:

​
char key;
if(kbhit())
{
   key=getch();
   switch(key)
...
}

I w switchu w zaleznosci od tego jaki to klawisz wykonujesz odpowiednie dzialania.

Twoje rozwiazanie ze sleepem bedzie dzialac, ale nie bedzie tak uniwersalne, bo sleep blokuje dzialanie calej petli. Ja proponuje skorzystac z time.h i funkcji clock() ktora zwraca czas od rozpoczecia programu, a pozniej robisz cos w stylu:

int poprzedniCzas=0, dlugoscCyklu=100;

if(dlugoscCyklu + poprzedniCzas > clock())
{
   poprzedniCzas += dlugoscCyklu;
   funkcjaKtoraChceszUruchomic();
}

 

komentarz 24 października 2015 przez Horace17 Obywatel (1,070 p.)
Bardzo dziękuję :)
komentarz 25 października 2015 przez Rogargol Pasjonat (16,600 p.)
Daj znac pozniej czy Ci sie udalo to zakodzic ladnie ;)
0 głosów
odpowiedź 24 października 2015 przez furas Maniak (53,800 p.)
Niektóre systemy dają sobie radę bez wątków. Po prostu na przemian sprawdzają klawisze i robią drobne wyliczenia. Żadna z tych rzeczy nie może trwać zbyt długo (np. nie może czekać aż klawisz zostanie wciśniety). Tak na przykład działają biblioteki/framworki do tworzenia gier (SFML, SDL) i pewnie tak też działają biblioteki do tworzenia GUI (wxWidgets, Qt)
komentarz 24 października 2015 przez Horace17 Obywatel (1,070 p.)
Mógłbyś mi powiedzieć jak wykonałbyś taki program ? 1 funkcja ma obliczać i wypisywać na ekran z pewną prędkością, a druga ma sprawdzać, czy jest wciśniety dany przycisk i w razie czego zmniejszać i zwiększać prędkość ?  Gdy próbowałem tak zrobić, to program czeka w miejscu, a ja chciałbym, żeby w tym czasie program normalnie się wykonywał.
komentarz 24 października 2015 przez Dorion300 Szeryf (90,250 p.)
Małe informacje:
Jemu chodzi o nauczenie się operowaniu na wątkach.
A nie o tym że niektóre programy można zrobić bez wątków mimo że wygląda to wielowątkowo,
komentarz 24 października 2015 przez Horace17 Obywatel (1,070 p.)
Przy okazji tego zadania chciałbym się nauczyć operować na wątkach, ale jeżeli da się łatwiej bez wątków, to nie mam nic przeciwko, choć zawsze czegoś nowego bym się nauczył. Pozdrawiam !
komentarz 24 października 2015 przez furas Maniak (53,800 p.)
Widzę, ze Rogargol wyjaśnił sprawę.

Pętla, w której na przemian robisz drobne wyliczenia (bez zatrzymywania pętli na dłużej) i sprawdzasz czy jakiś klawisz został wciśnięty (bez blokowania petli). W ten sposób dwie rzeczy wykonują się naprzemian i nie jest potrzebny wątek.

Jeśli obliczenia wymagają dłuższego czasu to wtedy trzeba jednak użyć wątków.

Często w różnych językach, w których tworzy się programy konsolowe, problemem jest brak funkcji sprawdzającej stan klawiatury bez blokowania wykonywania programu.
komentarz 24 października 2015 przez Rogargol Pasjonat (16,600 p.)
ja bym tez dodal ze mozna tez bazowac na zdarzeniach (niezle jest to w Qt rozwiazane), czy roznego rodzaju timerach, a tak jak mowisz furas, watki w momecie dlugioch operacji ktore zblokowalyby nam dzialanie programu. Przyznam, ze ja nie osiagnalem jeszcze poziomu ktory wymagalby ode mnie czestego stosowania watkow, raczej uzywalem jedynie z ciekawosci niz z przymusu.

Podobne pytania

0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 28 listopada 2015 w Java przez plox Początkujący (320 p.)
0 głosów
2 odpowiedzi 235 wizyt
pytanie zadane 5 grudnia 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
0 głosów
1 odpowiedź 711 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...