LINUX.ORG.RU

SDL перехват строки и скорость


0

0

Привет, кто знает как на SDL сделать перехавт строки.
Дело в том что я это сделал. Работаю с клавиатурным сканером штрих-кодов, когда сканируются цифры они очень быстро передаются, и я не успеваю получить все цифры. Хотя SDL_Delay у меня равен единице..



мой код

void Input(int size,bool scan=false)
   {
         SDL_Rect rect;
         rect.x=X+Parent->X;rect.y=Y+Parent->Y;
         rect.h=15;rect.w=size*10;
         SDL_Event event;
         text="";
         int done=0;
         bool isRussian = true;
         
         while(done==0)
         {
            while(SDL_PollEvent(&event)) //обрабатывать события и записывать в event
            {
               if(!scan) if(event.type == SDL_QUIT){ done = 1; } //если нажата кнопка закрытия
               if(event.type == SDL_KEYDOWN)   //если нажата кнопка на клавиатуре
               {
                  int key=event.key.keysym.unicode;
                  if(true)
                  {
                        if((key>='0')&&(key<='9')) text+=(char)event.key.keysym.unicode;
                        if((key>='A')&&(key<='Z')&&(!isRussian)) text+=(char)event.key.keysym.unicode;
                        if((key>='a')&&(key<='z')&&(!isRussian)) text+=(char)event.key.keysym.unicode;
      
                        if(isRussian)
                        {
                           if((key>='A')&&(key<='Z'))text+=toRus(key);
                           if((key>='a')&&(key<='z'))text+=toRus(key);
                           if((key=='[')||(key==']')||(key==';')||(key=='\")||(key==',')||(key=='.')||(key=='/'))text+=toRus(key);
                           if((key=='{')||(key=='}')||(key==':')||(key=='\«')||(key=='<')||(key=='>')||(key=='?'))text+=toRus(key);
                        }
            
                        if(key==' ') text+=(char)event.key.keysym.scancode;

                        if(event.key.keysym.sym==SDLK_TAB) if(isRussian)isRussian=false;else isRussian=true;
                        if(event.key.keysym.sym==SDLK_BACKSPACE)
                        {                     
                           if(text.length()>1)text.erase(text.length()-2);
                           if((text.length()>0)&(text.length()<2))text.erase(text.length()-1);
                        }
                  }
                  //if(scan) text+=(char)event.key.keysym.unicode;
                  if(event.key.keysym.sym==SDLK_RETURN) done=1;
               }
            }
            if(!scan)
            {
                  SetText(text);
                  clearR(240,240,240,rect);
            
                  Draw();

                  SDL_Rect dest;
                  dest.x=X+Parent->X+rect.w; dest.y=Y+Parent->Y; // отрисовка раскладки текста, 25 высота картинки
                  if(!isRussian) SDL_BlitSurface(SUR_ENG,NULL,screen,&dest);
                  else SDL_BlitSurface(SUR_RUS,NULL,screen,&dest);

                  SDL_Flip(screen);
                  SDL_Delay(1);
            }
      }
      SetText(text);
   }

Попробуй в терминал вывести со сканера. Может это не в SDL проблема. У меня как-то был глючный картридер, который половину символов терял.

А вообще попробуй «SDL_Event event» добавить непосредственно перед «while(SDL_PollEvent(&event))». Вроде внешний цикл (" while(done==0)") всего один раз выполняется у тебя, но мало ли.

Esh ★★★★
()

> Хотя SDL_Delay у меня равен единице.

Это у вас SDL_Delay равен единице, но система не гарантирует точную задержку. Об этом и в мане сказано. Более того, на разных системах точность может быть разной.

andreyu ★★★★★
()

И, надеюсь, вы делаете SDL_EnableUNICODE(SDL_ENABLE)?

Проверку на введенный символ нужно делать где то так:

if((evt.key.keysym.unicode & 0xFF80) == 0) {
   // ваш символ == evt.key.keysym.unicode & 0x7F;
}
else {
   // ваш символ == evt.key.keysym.unicode;
}
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

все включено, все делал как надо и сканер работает нормально. Делал консольную прогу и использовал там getch(), все нормально считывает, но в SDL getch() не работает, т.к. нет терминала. Какой-то тупизм, у SDLовцев руки кривые чтоли. Я 2 недели проект писал мне его сдавать заказчику уже, а тут такой косяк! Где определять евент значения не имеет, он нужен для того чтобы функция SDL_PollEvent засунула туда данные для чтения их.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

может кто знает тупо библиотеку для работы с клавиатурой, только не GTK не QT и т.д. у меня в системе не планируются иксы

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Делал консольную прогу и использовал там getch(), все нормально считывает,

но в SDL getch() не работает, т.к. нет терминала. Какой-то тупизм,

у SDLовцев руки кривые чтоли.

да да, еще нас всех идиотами обозвать забыли

anonymous2 ★★★★★
()

вам нужно переходить на более низкий уровень, тем более работа с оборудованием. система + keyboard event в поиск

anonymous2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.