Portál AbcLinuxu, 29. května 2022 11:48



Dotaz: Aplikace (Bash 5+ ) v celém terminálu poskakuje

13.1. 15:47 host
Aplikace (Bash 5+ ) v celém terminálu poskakuje
Přečteno: 656×
Odpovědět | Admin
Zdravím, v terminále používám celou obrazovku pro výpis textů s čísel, přesunuji pozice výpisu pomocí šipek na klávesnici a pomocí tput cup x y. Když ale mačkám šipku na klávesnici rychleji nebo ji držím, obraz začne poskakovat nahoru a dolů. Vím, že Bash není zrovna vhodný pro takové aplikace ale je to již poslední problém se kterým si nevím rady jak to opravit. Poradí někdo? Děkuji.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.1. 15:54 debian+ | skóre: 30 | blog: analyzy
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ošetriť, ze na vstupe môže prijať iba max 10 (Unicode) znakov za sekundu a zbytok zahodiť.

Prepísať aplikácie do ncurses.

Ojedinele, zvýšiť maximálnu rýchlosť prúdenia dát cez tty.
debian.plus@protonmail.com
13.1. 20:21 host
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
Ahoj, můžeš prosím trochu rozvést tu první možnost? Nemůžu nic najít, děkuji.
Gréta avatar 13.1. 21:40 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje

asi jako myslel že si v tom loopu kde koukáš jakej je jakoby uživatelem máčknutej čudlik si budeš nějak pamatovat čas vod posledního máčknutí a když ten rozdíl bude menčí neř třeba 100ms tak misto akce ten vstup zahodíš :D ;D

asi něco jako todlecto snad (nevim jak děláš s inputem)


#!/usr/bin/env bash

#kdy naposled sme něco psali do terminálku
naposled=0

# nekonečnej loop (vypneš ctrl+c)
while true; do

    # skováme si máčknutej znak do proměný 'písmenko'
    stty cbreak
    pismenko=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
    stty -cbreak

    # chcem milisekundy
    tedko=$(($(date +%s%N)/1000000))
    # spočitáme jakej je jako rozdíl mezi posledním máčknutím a časem teďkonc
    ((delta=tedko-naposled))

    # když je delta víc jak 100ms tak napišem jaký se jako písmenko máčklo a skováme do proměný 'naposled' novej čas
    if [ $delta -gt 100 ]
    then
        echo "macknuty pismenko: $pismenko"
        naposled=$tedko
    fi
done
13.1. 22:56 host
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
Děkuji za ukázku, nemůžu to vyzkoušet, píše mi to chybu které nerozumím.

řádek 15: 1642110614N: hodnot je pro základ příliš velká (chybný token je „1642110614N“)
Gréta avatar 13.1. 23:21 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje

to nevim :O :O to vypadá jakobytam zustalo takový to N a % chtělo asi udělat modulo :O :O

co ti vypiše příkaz

date +%s%N

jakou máš verzi date :O :O

date --version
14.1. 00:35 host
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
date +%s%N
1642116726N

date --version
date: illegal option -- -
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

Gréta avatar 16.1. 02:18 Gréta | skóre: 35 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje

neni to jakoby macOS nebo bsd?? :O :O date tam prej neumí nanosekundy :O :O

mohla by ale jako fungovat epochrealtime proměná hele :O ;D

nejdřiv si ji zkus vypsat příkazem

echo $EPOCHREALTIME

jestli ti jako funguje + koukni jestli to piše desetinou čárku ',' nebo tečku '.' a podletohodlectoho předělej řádek 15 by se dával dopryč ten správnej znak

#!/usr/bin/env bash
 
#kdy naposled sme něco psali do terminálku
naposled=0
 
# nekonečnej loop (vypneš ctrl+c)
while true; do
 
    # skováme si máčknutej znak do proměný 'písmenko'
    stty cbreak
    pismenko=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
    stty -cbreak
 
    # chcem milisekundy
    tedko=$((${EPOCHREALTIME//,}/1000))
    # spočitáme jakej je jako rozdíl mezi posledním máčknutím a časem teďkonc
    ((delta=tedko-naposled))
 
    # když je delta víc jak 100ms tak napišem jaký se jako písmenko máčklo a skováme do proměný 'naposled' novej čas
    if [ $delta -gt 100 ]
    then
        echo "macknuty pismenko: $pismenko"
        naposled=$tedko
    fi
done
17.1. 15:15 GNU is not unix!
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
BSD date je POSIX2 only, GNU date ma ficury navic. Je ale mozne doinstalovat (nebo uz ho snad i mas) gdate. Pak treba v macOS:

date +%s%N

1642428553N

gdate +%s%N

1642428709323360000
17.1. 15:21 GNU is not unix!
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
Pokud jej nemas tak v BSD
pkg install coreutils
v macOS
brew install coreutils
5.4. 14:26 debian+ | skóre: 30 | blog: analyzy
Rozbalit Rozbalit vše Re: Aplikace (Bash 5+ ) v celém terminálu poskakuje
Prípadne ešte buferovať výstup. Napr. tty ma nastavené nejakú rýchlosť, takže limitovať takto dátový tok, aby neprekročil tty. Pripadne aj buffer a limitovať draw.
debian.plus@protonmail.com

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.