Elikkäs, aloittelevana harrastelijakoodarina kysyisin tällaista, että miten saisi tehtyä koodinpätkän jossa ohjelma kysyy käyttäjältä vaikka yhtä kirjainta viiden sekunnin ajan ja jollei siihen mennessä mitään paina, asettaisi ohjelma kysytyn muuttujan arvoksi vaikkapa 'a':an.
Tällöinhän koneen pitäisi samanaikaisesti vilkuilla kelloa ja valvoa kirjainkysymisfunktiota. Tai vuorotella nopeasti, olenko oikeassa?
Silmukka jonka ehtona on joku timer setti ja silmukassa kysyy sitten arvoa. If-lauseella sijoittaa a:n tulokseksi jos ei käyttäjä anna syötettä.
aa, huomasinkin just jostain vanhastaa viestistä tämmösen ku threads eli säikeet. Kokeilin jotain ton suuntaista mitä selitit zmyrgel, mutta se jumitti siihen kysymiseen eikä, pääsyt testamaan ehtoa uudelleen. Eli teki yhtä asiaa kerrallaaan.
Toinen vaihtoehto matalalla tasolla on suunnilleen sellainen, että kun (aika < 5s), katsotaan, onko jokin nappi pohjassa. Tulee vain eteen C++:n laitteistoriippumattomuus, jonka takia tällaista ei ole voitu toteuttaa. Kuitenkin esimerkiksi Windowsin funktioilla sellaisen voisi tehdä. Kannattaa vilkaista myös NCurses- eli PDCurses-opasta.
Pakko kai se on vastata kun taas vaihteeksi oppaani nousee esiin. Eli Ncursesilla / PDCursesilla tuo onnistuu helposti. Lainaan nyt itseäni eräästä heinäkuisesta ketjusta:
Oppaassa en mainitse kuvaamallasi tavalla toimivaa reaaliaikaisuutta, mutta nyt onkin helppo korjata tämä tilanne tässä samalla.
Alla olevan linkin takana olin virheellisesti sanonut tilan nimeksi halfbreak vaikka todellisuudessa nimi näkyy olevan halfdelay. Pahoittelen.
https://www.ohjelmointiputka.net/keskustelu/9471-cin-ei-pysähtymään-cpp
Kuitenkin uskoisin, että pdcursesilla tai ncursesilla reaaliaikaisuus onnistuu. Jos lähdet tutustumaan ncursesiin/pdcursesiin, kannattaa tutustua ainakin seuraavaan tilaan: int halfdelay(int tenths);
Halfdelay-tilassa odotetaan sekunnin kymmenyksien verran syötetta; jos syötettä ei kuulu, getch(); palautta ERR:n. Jos syöte tulee, ohjelman suoritus jatkuu ja syöte on käytettävissä. Ja näitä tiloja tosiaan sitten on muitakin. Kannattaa turvautua unix-manuaaliin:
http://bama.ua.edu/cgi-bin/man-cgi?00 00
Ja nyt tehdään sitten esimerkkipätkä ncursesia käyttämällä.
// windowsissa <curses.h> kun pdcurses on asennettuna #include <iostream> #include <ncurses.h> #include <string> using namespace std; int main() { // Alustetaan ncurses initscr(); // Näppäinten painallusten "kaikuminen" päälle echo(); // Halfdelaysta poistutaan nocbreak(); -funktiolla. // Viiden sekunnin jälkeen jatketaan ohjelman suoritusta vaikka käyttäjä ei olisikaan antanut syötettä getch():iä kutsuttaessa. halfdelay(50); // Kursori pois näkyvistä. curs_set(0); string tmp=""; while(tmp.size() < 10) { int ch = getch(); if(ch==ERR) // Ei syötettä, sijoitetaan 'a'. tmp += "a"; else tmp += (char)ch; } endwin(); // Poistutaan curses-tilasta. cout << tmp << endl; return 0; }
Mukava kun viitsit nähdä vaivaa, pienellä selailulla olisi kyllä itsekin pitänyt aikaisemmat aiheet löytää...
Kiitos kumminkin, auttoivat suuresti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.