Forum Coders' city Strona Gwna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UytkownicyUytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj si, by sprawdzi wiadomociZaloguj si, by sprawdzi wiadomoci   ZalogujZaloguj 

Potrzebuj szybkiej odpowiedzi na moje pytanie... Zasady

[WinAPI/POSIX] Sprawdzenie stanu klawiatury



 
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Biblioteki
Zobacz poprzedni temat :: Zobacz nastpny temat  
Autor Wiadomo
psrok1



Doczy: 28 Cze 2011
Posty: 274
Skd: Olsztyn

PostWysany: Nie Kwi 06, 2014 11:12 am  OP    Temat postu: [WinAPI/POSIX] Sprawdzenie stanu klawiatury Odpowiedz z cytatem Pisownia

Mam do napisania projekt w C++ stanowicy symulacj ruchu drogowego. Problem jest nastpujcy: po uruchomieniu symulacji chciabym mie moliwo wstrzymania jej i przejcia do interfejsu umoliwiajcego dodawanie pojazdw i inne akcje.
Potrzebowabym do tego celu np.: sprawdzenia stanu klawisza. Chciabym jednak, by kod by kompilowalny zarwno pod Windows, jak i Linux. Nie chciabym te zaprzga ncurses/pdcurses do tak prostej rzeczy.
Na razie postanowiem obsuy CTRL-C:
Kod:

#include "CtrlCHandler.h"
#ifdef __linux__
#include <csignal>
#include <unistd.h>
#elif _WIN32
#include <Windows.h>
#include <atomic>
#else
#error "OS not supported: turn off CTRL-C handling"
#endif

namespace CtrlCHandler
{
#ifdef __linux
    volatile sig_atomic_t stop = 0;
    void handler(int s);
#elif _WIN32
    std::atomic<int> stop = 0;
    BOOL __stdcall handler(DWORD dwCtrlType);
#endif
    void Set();
    void Release();
    bool GetState();
}

#ifdef __linux__

void CtrlCHandler::handler(int s)
{
    CtrlCHandler::stop = 1;
}

#elif _WIN32

BOOL __stdcall CtrlCHandler::handler(DWORD dwCtrlType)
{
    if (dwCtrlType == CTRL_C_EVENT)
    {
        CtrlCHandler::stop = 1;
        return TRUE;
    }
    else
        return FALSE;
}

#endif

void CtrlCHandler::Set()
{
    stop = 0;
#ifdef __linux__
    signal(SIGINT, CtrlCHandler::handler);
#elif _WIN32
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlCHandler::handler, TRUE);
#endif
};

void CtrlCHandler::Release()
{
#ifdef __linux__
    signal(SIGINT, SIG_DFL);
#elif _WIN32
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlCHandler::handler, FALSE);
#endif
}

bool CtrlCHandler::GetState()
{
    bool result = (stop == 1);
    if (result)
        stop = 0;
    return result;
}


Czy istnieje jakie lepsze rozwizanie? :)
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Numer GG
marcin_an



Doczy: 26 Maj 2005
Posty: 18822

PostWysany: Pi Kwi 11, 2014 11:08 pm      Temat postu: Odpowiedz z cytatem Pisownia

Ctrl+C, ktry powinien suy do zabijania procesw z terminala, obsuye w zupenie innym celu. Ale ju pomijajc to: czym masz zamiar sterowa pniej? SIGTERM bdzie dodawa pojazd a SIGCHLD - usuwa go? I jak bdziesz te sygnay wywoywa? Z terminala obok? Powiedziabym, e to kiepski sposb na sterowanie. Mam wraenie, e jednak wygodniej bdzie sterowa klawiatur albo - jeli koniecznie przez IPC - to przez bardziej nadajce sido przesyania danych. Jeli klawiatur, to curses. Po to wanie takie biblioteki s, eby uatwi obsug terminala. Ewentualnie akceptuj dane ze standardowego wejcia i traktuj je jako polecenia. Jest to najbardziej uniwersalne rozwizanie, ale oczywicie wymaga opracowania protokou, eby sensownie radzi sobie z bdami w poleceniach.

Nie wiem, jak w tej chwili masz wymodelowan aplikacj, ale dla kadego z trzech popularnych scenariuszy:
  • Kontroler symulacji jest w oddzielnym wtku i tylko wysya aktualizacje lub kopie modelu do widoku
    Umoliwi pauzowanie symulacji. Jeeli po wykonaniu kroku symulacja zauway, e dostaa polecenie pauzy, zaprzestanie dalszego dziaania i umoliwi dostp do modelu innym czciom programu. Gdy te zmodyfikuj model, symulacja zostanie odpauzowana.
  • Kontroler symulacji jest w oddzielnym wtku i okresowo zatrzymuje si, udostpniajc model widokowi
    Niech udostpnia nie tylko widokowi, ale kademu chtnemu w celu modyfikacji.
  • Wszystko dziaa w jednym wtku, a konstroler symulacji okresowo wywouje aktualizacjwidoku
    Niech wywouje take kod modyfikujcy model wg wydanych polece.
Ten "inny kod" to oczywicie panel sterujcy lub co, co odbiera od niego polecenia. Jeeli bdzie dziaa w oddzielnym wtku, to cakowicie synchronicznie moe czeka na dane z wejcia lub wcinicia klawiszy, bo symulacji nie blokuje. Jeli dziaa w tym samym wtku, co symulacja, czyli jest to ostatni z przedstawionych przypadkw, to bdzie musia asynchronicznie sprawdza, czy uytkownik co nacisn. Jeli nie, to wraca do symulacji bez zmieniania czegokolwiek. Jeli tak, to moe sobie spokojnie zablokowa symulacj i reszt komunikacji z uytkownikiem wykona synchronicznie.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
Wywietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Biblioteki Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Moesz pisa nowe tematy
Moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Moesz dodawa zaczniki na tym forum
Moesz pobiera pliki z tego forum




Debug: strone wygenerowano w 0.30757 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |