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

[C++] [wątki] Jednoczesne działanie minutnika i wczytywanie zmiennej (cin)

VPS Starter Arubacloud
0 głosów
962 wizyt
pytanie zadane 20 listopada 2016 w C i C++ przez Marcin Saffenreuther Nowicjusz (150 p.)
Witajcie dobrzy ludzie.

Mam problem z projektem z programowania, a mianowicie, celem programu jest badanie zdolności analitycznych człowieka, wyświetla równania do obliczenia w pamięci o różnym stopniu trudności, następnie po zakończeniu testu ma wyświetlać wyniki. Skończyłem pisać większość programu, ale zaciąłem się na jednym aspekcie. Test ma się kończyć równo 60 sekund po jego rozpoczęciu (czas wyświetlany na bieżąco) , co więcej jeśli człowiek nie odpowie na równanie w ciągu 10 sekund, to równanie ma zniknąć i zaliczyć jako błędną odpowiedź. I tu pojawia się problem. Jak jednocześnie wczytywać odpowiedzi użytkownika i nie blokować działania timera? Wiem, że istnieje coś takiego jak wielowątkowość, ale niestety nie potrafię tego zaimplementować (od rana siedzę nad dokumentacją z marnym skutkiem). Czy ktoś rozwiązał w przeszłości podobny problem? Jeśli tak to proszę o jakieś przykłady z wczytywaniem zmiennych "w tle", wskazówki, ewentualnie literaturę. Dodam tylko, że w projekcie mogę korzystać tylko ze standardowych bibliotek, więc jedyną opcją wielowątkowości jest biblioteka thread.h.
Za wszystkie odpowiedzi z góry dziękuję. :)

1 odpowiedź

+4 głosów
odpowiedź 20 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
wybrane 20 listopada 2016 przez Marcin Saffenreuther
 
Najlepsza

Od c++ 11 wprowadzono fajnie działającą klasę thread.
Jest ona banalna w obsłudze.
Tworzysz obiekt klasy std::thread
 

#include <iostream>
#include<thread>
using namespace std;

void func()
{
	cout << "FUNKCJA" << endl;
}

int main() {
	thread thrd(func);
	//TUTAJ SOBIE LECI KOD JAK SE CHCESZ. WATEK JUZ DZIALA
	thrd.join();
}

A więc tak.

  1. Zdefiniowałem sobie funkcję która trzeba dać do argumentu.
  2. Stworzyłem nowy obiekt klasy std::thread, o nazwie thrd.
  3. Jako argument konstruktora użyłem nazwy funkcji którą ma wykonać w osobnym wątku
  4. W momencie użycia metody "thrd.join()" główny wątek czeka na dokończenie wątku thrd po czym jedzie dalej.

Aby przekazać jakieś argumenty do funkcji którą chcemy przekazać do konstruktora std::thread należy:

#include <iostream>
#include<thread>
using namespace std;

void func(int value)
{
	cout << "FUNKCJA " << value << endl;
}

int main() {
	thread thrd1(func, 1);
	thread thrd2(func, 2);
	thread thrd3(func, 3);

	//TUTAJ SOBIE LECI KOD JAK SE CHCESZ. WATEK JUZ DZIALA

	thrd1.join();
	thrd2.join();
	thrd3.join();
	return 0;
}

Argumenty funkcji podajemy po argumentowanej funkcji, po przecinkach.


Możesz też chcieć przerwać w działanie funkcji(wątku) w momencie w którym program dojdzie do metody thrd.join();
Wystarczy zamiast join() wywołać metodę thrd.detach();
Wtedy wątek automatycznie przerywa działanie, nie ważne co robiąc, a program lecie dalej z kodem.

Generalnie tyle powinno ci wystarczyć na start. Resztę możesz już doczytać w dokumentacji.

PS. Jeżeli chcesz mieć wątek w klasie, a funkcją wątka jest metoda tej klasy to musisz to zrobić tak:
 

nazwaObiektuKlasyThread(&NazwaKlasy::nazwaMetody, this);

Piszę to, ponieważ mi samemu sporo zajęło żeby to ogarnąć.

komentarz 20 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Przepraszam że tak się wtrącę, nie jestem autorem pytania, ale dziękuję za informację o tej bibliotece. Mam pytanie. Co jeżeli właśnie chcąc odliczać czas, chcemy aby cyfry 1, 2, 3 wyświetlały się po kolei jednocześnie czyszcząc ekran z poprzednich cyfr. Wiem że system("cls") działa tak jak bym chciał, ale czyści on wszystko, a ja chciałbym np. tylko w aktualnym thread.
komentarz 20 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
Czyli mówiąc że chciałbyś czyścić aktualny thread, masz na myśli to żeby usuwała się tylko część zawartości konsoli?
komentarz 20 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Chciałbym na przykład czyścić ekran co sekundę w wątku "czas" i tam osobno liczyć czas, osobno punkty itp. Ogółem tak, to co napisałeś powyżej. 

 

komentarz 20 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
Mógłbyś spróbować zrobić zmienną czas, którą wysłałbyś przez referencję do funkcji która robi za wątek i tam ją aktualizować i zrobić drugi wątek który byłby odpowiedzialny za rysowanie po konsoli. Mógłbyś pobawić się też w taki sposób, żeby ekran nie migał i aktualizował się wtedy kiedy zmienią się wartości.

Mógłbyś się też bawić z winAPI, ale to do najprostszych rzeczy nie należy.
komentarz 20 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Widzę że znasz się na rzeczy. Powiedz mi, czy istnieje może jakaś metoda/funkcja która działa jak pop.back dla pojedynczego znaku w konsoli? Takie coś byłoby dla mnie idealnym wyjściem.
komentarz 20 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
edycja 20 listopada 2016 przez Knayder
Wiesz co, jako że odchodzimy od tematu proponowałbym przejść na priv.
Jeżeli masz możliwość to dodaj mnie gdzie uważasz:
Skype: XX
Discord: XX
komentarz 20 listopada 2016 przez Marcin Saffenreuther Nowicjusz (150 p.)
Dziękuję bardzo, projekt skończony :D

Podobne pytania

0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez Storm Obywatel (1,570 p.)
0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 24 maja 2017 w Java przez gaaf Nowicjusz (140 p.)
+1 głos
1 odpowiedź 739 wizyt
pytanie zadane 29 grudnia 2016 w Java przez Wiciorny Ekspert (277,460 p.)

93,006 zapytań

141,973 odpowiedzi

321,254 komentarzy

62,345 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...