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

Komunikacja w kosoli c++ cin i cout jednocześnie

0 głosów
1,106 wizyt
pytanie zadane 1 czerwca 2019 w C i C++ przez Karol Bychowski Nowicjusz (140 p.)
Witam,

czy jest jakiś sposób aby jednocześnie używać cout w czasie trwania cin?

Chodzi o to że jeżeli przyjdzie wiadomość, żeby ta wiadomość od razu pojawiła się w konsoli czyli jakby przerwanie cin, wypisanie tekstów i powrót do cin.

1 odpowiedź

0 głosów
odpowiedź 1 czerwca 2019 przez Piotr Batko Stary wyjadacz (13,210 p.)

Na tym filmie, jako wstęp do wątków, Cherno implementuje dokładnie to czego potrzebujesz :)
Threads in C++

komentarz 1 czerwca 2019 przez Karol Bychowski Nowicjusz (140 p.)
Ooo, zaraz zobaczę i przetestuje, dzięki bardzo :)
komentarz 1 czerwca 2019 przez Karol Bychowski Nowicjusz (140 p.)

@Piotr Batko, wszystko okey, tylko jest jakaś opcja aby wpisywany tekst nie kolidował z tym co się wysyła?

komentarz 3 czerwca 2019 przez Szfierzak Gaduła (3,750 p.)
W konsoli raczej nie ma takiej opcji.
komentarz 3 czerwca 2019 przez mokrowski Mędrzec (158,960 p.)
Oczywiście że jest. Standard nie gwarantuje "ciągłości danych wyświetlanych ze strumienia" co do jego obsługi w wątkach. Gwarantuje jedynie poprawne jego wielokrotne użycie (ang. reentrant) oraz prawidłowy (spójny) odczyt.

Stosujesz więc w tym przypadku synchronizację z użyciem std::lock* lub (jeśli kod ma być bardzo wydajny), zmienną decyzyjną (ang. condition variable). Trzecim (wygodnym) rozwiązaniem jest std::async.

Intuicyjne jednak czuję że pytasz raczej o "możliwość wciśnięcia klawisza X i żeby program zareagował". Jeśli tak, to i pytanie jest obok Twoich potrzeb i także rady w tym wątku.
komentarz 4 czerwca 2019 przez Szfierzak Gaduła (3,750 p.)
Aż jestem ciekaw, można w takim razie zablokować konsolę podczas wpisywania ciągu znaków tak, żeby to co przyjdzie z innego wątku nie wyświetliło się "pomiędzy" wprowadzanymi "z palca" znakami?
1
komentarz 4 czerwca 2019 przez mokrowski Mędrzec (158,960 p.)

Taki "prostacki" przykład. Usuń komentarz przy blokadach i zobacz jaka będzie różnica w wynikach. Przykład jest "anty" bo wymuszałem przeplot (w większości implementacji):

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>

namespace {

std::mutex mtx;

}

void brumFunc() {
    for(auto i = 0; i < 10; ++i) {
        //std::unique_lock<std::mutex> l(mtx);
        for(auto c: { 'b', 'r', 'u', 'm', ' ' }) {
            std::this_thread::sleep_for(std::chrono::milliseconds(5));
            std::cout << c;
            std::cout.flush();
        }
    }
}

void trataFunc() {
    for(auto i = 0; i < 10; ++i) {
        //std::unique_lock<std::mutex> l(mtx);
        for(auto c: { 't', 'r', 'a', 't', 'a', ' ' }) {
            std::this_thread::sleep_for(std::chrono::milliseconds(5));
            std::cout << c;
            std::cout.flush();
        }
    }
}

int main() {
    auto tr1 = std::thread(brumFunc);
    auto tr2 = std::thread(trataFunc);
    for (auto t: {&tr1, &tr2}) {
        t->join();
    }
}

PS. Oczywiście tak nie polecam programować :) Ani to wydajne ani ładne.

komentarz 5 czerwca 2019 przez Szfierzak Gaduła (3,750 p.)
Zasadę działania mutexa znam. Pisałem właśnie dość długi post o tym jak działa mój system klient-serwer, opisując jak w opcji "ręcznej obsługi" mieszają mi się komunikaty wymieniane między aplikacjami, z komunikatami, które muszę wpisać z klawiatury, ale właśnie mnie oświeciło xD Dlaczego nie wpadłem na to do tej pory xD Dziękuję. Nie mam pytań xD

Podobne pytania

0 głosów
1 odpowiedź 1,024 wizyt
pytanie zadane 13 marca 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)
0 głosów
1 odpowiedź 1,280 wizyt
pytanie zadane 25 sierpnia 2019 w JavaScript przez kodowiec Początkujący (410 p.)
0 głosów
1 odpowiedź 3,409 wizyt
pytanie zadane 25 października 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)

93,732 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,293 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...