[C++]jak zrobic ograniczenie czasowe na wczytywanie z klawia

0

hi
mam taki problem,ze nie wiem jak napisac funkcje,ktora pozwoli czytac cos z klawiatury tylko np.przez 15 sekund. probowalam cos wykombinowac z peek()ale nie bardzo mi wyszlo :(
help me ... plizz :)
pozdro

0

troszke prymitywne ale powinno dzialac , zacznij od ustawienia sobie zmiennej typu bool o nazwie np moznapisac , zmiennej int której przypiszesz wartosc poczatkowa = 0 o nazwie np ilesekund , w timerze ustaw interwal na 1000 , i zrób instrukcje warunkowa

if(ilesekund<=15)
{
moznapisac=true;

} else moznapisac=false;

i wtedy jak bedziesz chciał cos na klawie pisac to tylko jezeli mozna pisac=true bedziesz robic taka instrukcje warunkowa , a jak chcesz to zresetowac to daj np do buttona ilesekund=0; oczywiscie ilecekund i moznapisac to zmienne globalne , pewnie jest cos łatwiejszeo ale mi do głowy nie przychodzi
//ups chodzilo chyba o to zeby to w c++ zwyczjnym było

0

hi
mam taki problem,ze nie wiem jak napisac funkcje,ktora pozwoli czytac cos z klawiatury tylko np.przez 15 sekund. probowalam cos wykombinowac z peek()ale nie bardzo mi wyszlo :(
help me ... plizz :)

P.S.
Chodzi o czyste C++ na linucha :) pozdro.... [nie builder!]

pozdro

0

Funkcja clock() z time.h (standard ansi) zwraca ilośc tyknięc od początku pracy programu (18.2 raza na sekundę zwieksza się licznik). To samo, tylko od północy zwraca przerwanie 0x1a (wejscie ah=0, wyjscie cx : dx - unsigned long- cx starsze słowo). Co do sprawdzenia stanu klawiatki: funkcje przerwania 0x16 (ah=) 0x01, 0x11 sprawdzają stan bufora klawiatury, funkcje 0x00 i 0x10 obczytują klawisz z bufora klawiatury:

#include <stdio.h>

void getkey(unsigned char& k1,unsigned char& k2){
  asm{
    mov ah,10h
    int 16h
  }
  k1=_AL;
  k2=_AH;
}

char keyhit(){
  asm{
    mov ah,11h
    int 16h
  }
  return (!((_FLAGS>>6)&1)); // odwrócona flaga zero
}

unsigned long clock(){
  asm{
    xor ah,ah
    int 1ah
  }
  return (unsigned long)((_CX<<16)+_DX); // + lub | (or) lub ^ (xor) - do wyboru
}

void main(){
  unsigned long czas=clock()+(15*18.2); // 15 sekund
  unsigned char k1=0;
  unsigned char k2=0;
  do{
    printf("czas pozostaly : %i s.  klawisz : %i , %i \n",
      unsigned((czas-clock())/18.2),k1,k2);
    if(keyhit())getkey(k1,k2);
  }while(clock()<=czas && k1!=27);
}

Napisałem to dla borlanda, nie wiem, czy pod linuxem masz dostępne rejestry pod postacią _AX, _BX, ... Jakby nie to zawsze pozostają istrukcje les/lds itp. Funkcje odczytu z klawiatury radzę używać parami 00h i 01h lub jak w przykładzie 10h i 11h, bo różnią się tym, że druga parka widzi i obsługuje więcej klawiszy. Jeśli masz odpowiednik conio, to mozesz użyć funkcji kbhit zamiast keyhit i getch zamiast getkey.

Doszły mnie słuchy, że pod linuxem brak asm'a (czy to mozliwe? - sprawdziłem asm jest, tylko ma inną notację, phi: xor %ah,%ah, mov 11h,%ah), więc może coś takiego... Oczywiście ewentualnie trzeba wziąc poprawkę na REGPACK i intr odpowiednio dla kompilatora. Funkcja clock() powinna być zadeklarowana w time.h.

#include <dos.h>

void getkey(unsigned char& k1,unsigned char& k2){
  REGPACK r;
  r.r_ax=

0x1000

;       // ah=10h, al=00
  intr(

0x16

,&r);     
  k1=r.r_ax & 

0xff

;
  k2=r.r_ax >> 8;
}

char keyhit(){
  REGPACK r;
  r.r_ax=

0x1100

; 
  intr(

0x16

,&r);
  return (!((r.r_flags>>6)&1));
}

unsigned long clock(){
  REGPACK r;
  r.r_ax=0;
  intr(

0x1a

,&r);     
  return (unsigned long)((r.r_cx<<16)+r.r_dx);
}

albo równoważny topic obok:
http://4programmers.net/Forum/viewtopic.php?id=47058

1 użytkowników online, w tym zalogowanych: 0, gości: 1