keypress c ala?

Fórumok

keypress c ala?

Hozzászólások

fu, koszi a hozzaszollast, de ennel vmie egyszerubbet gondoltam, ez most nekem tulkomplikalt. :)folyamatosan keresgelek vmi megoldast, de meg semmi mukodo megoldast nem talaltam. amit felfogtam volna :D

[quote:f169a3fe21="miszterx"]Olyan problemam van, hogy azt szeretnem kikuszobolni hogy, ncurces.h alatti getch() valahogy NE VARJON, egy bill leutesere, csak akkor olvassa be egy valtozoba a getch megvaltozott erteket, ha tortent leutes, ha nem akkor ne csinaljon semmit fusson a ciklus tovabb. Erre valahogy nemtalaltam megoldast. Esetleg valaki tudna ra nekem egy fuggvenyt? vagy mas megoldast? Koszi elorre is.

Ezzel sokat szenvedtem én is. Ma odáig jutottam, hogy nem
használom a billentyűt. Valahogy erre tart a világ, ki tudja miért.
Volt valam megoldásom, de annyira nyakatekert volt, hogy eldobtam.
Valszeg gondolkodásmódot kell változtatni.

Csinálj valami grafikus felületet, ott talán kezelhető a probléma.

Ezt találtam:

int main(int argc, char *argv[])
{int switchkey;

printf(maintitle);StartHix((void *)&HixExit,(void *)&NoPower);
LogCount=SrnOffset=SrnPage=0;

initscr();keypad(stdscr,TRUE);cbreak();noecho();
KBled(N_LOCK,TRUE);

if(SMinit(0)>0)
{if(!MBRegData[STANASCD])memmove((unsigned char*)&MBRegData[STANASCD],DefStaName,10);
StartMeaTimer(0,200000);

while (1)
{if((switchkey=getch()))
{switch(switchkey)
{case 27: /*goto quexit;*/break;
case 265: SrnPage=0;SrnOffset=0;break;
case 266: SrnPage=2;SrnOffset=0;break;
case 267: SrnPage=5;SrnOffset=0;break;
case 268: SrnPage=8;SrnOffset=0;break;
case 269: SrnPage=11;SrnOffset=0;break;
case 270: SrnPage=47;SrnOffset=0;break;
case 271: SrnPage=49;SrnOffset=32;break;
case 272: SrnPage=74;SrnOffset=0;break;
//key F1-F8

case 338:
n338: if(SrnOffset)SrnOffset--;
else{if(SrnPage){SrnPage--;SrnOffset=(128/MAXLINE)-1;}}
if((!SrnLineCnt())&&((SrnPage)||(SrnOffset)))goto n338;
break; //key PGdown

case 339:
n339: if(SrnOffset<(128/MAXLINE)-1)SrnOffset++;
else{if(SrnPage<79){SrnPage++;SrnOffset=0;}}
if((!SrnLineCnt())&&((SrnPage<79)||(SrnOffset<(128/MAXLINE)-1)))goto n339;
break; //key PGup

/* Test codes */
/*
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38: CommonTable[32+(switchkey-0x31)].r_data=1;
CommonTable[32+(switchkey-0x31)].last='i';
break;

case 0x61:
case 0x62:
case 0x63:
case 0x64:
case 0x65:
case 0x66:
case 0x67:
case 0x68: CommonTable[32+(switchkey-0x61)].r_data=0;
CommonTable[32+(switchkey-0x61)].last='i';
break;
*/
/* End of test */

default: break;
}BegDev=SrnPage*128+SrnOffset*MAXLINE;
}usleep(20000);}}

quexit: StopHix();printf("\nIactive: Normal termination.\n");
return (0);
}

-----------------
Azt hiszem itt van valami, ami neked hasznos lehet.

[quote:af6f836b01="miszterx"]Olyan problemam van, hogy azt szeretnem kikuszobolni hogy, ncurces.h alatti getch() valahogy NE VARJON, egy bill leutesere, csak akkor olvassa be egy valtozoba a getch megvaltozott erteket, ha tortent leutes, ha nem akkor ne csinaljon semmit fusson a ciklus tovabb. Erre valahogy nemtalaltam megoldast.

Persze, ha nem is keresel... nehezen talalsz ;-) [quote:af6f836b01="miszterx"]Esetleg valaki tudna ra nekem egy fuggvenyt? vagy mas megoldast? Koszi elorre is.

RTFM

man getch
man inopts

[code:1:af6f836b01] The getch, wgetch, mvgetch and mvwgetch, routines read a character from
the window. In no-delay mode, if no input is waiting, the value ERR is
returned. In delay mode, the program waits until the system passes
text through to the program. Depending on the setting of cbreak, this
is after one character (cbreak mode), or after the first newline
(nocbreak mode). In half-delay mode, the program waits until a charac-
ter is typed or the specified timeout has been reached.
[/code:1:af6f836b01]

[code:1:af6f836b01] Normally, the tty driver buffers typed characters until a newline or
carriage return is typed. The cbreak routine disables line buffering
and erase/kill character-processing (interrupt and flow control charac-
ters are unaffected), making characters typed by the user immediately
available to the program. The nocbreak routine returns the terminal to
normal (cooked) mode.
...
The echo and noecho routines control whether characters typed by the
user are echoed by getch as they are typed. Echoing by the tty driver
is always disabled, but initially getch is in echo mode, so characters
typed are echoed. Authors of most interactive programs prefer to do
their own echoing in a controlled area of the screen, or not to echo at
all, so they disable echoing by calling noecho. [See getch(3NCURSES)
for a discussion of how these routines interact with cbreak and
nocbreak.]
...
The nodelay option causes getch to be a non-blocking call. If no input
is ready, getch returns ERR. If disabled (bf is FALSE), getch waits
until a key is pressed.

...
The timeout and wtimeout routines set blocking or non-blocking read for
a given window. If delay is negative, blocking read is used (i.e.,
waits indefinitely for input). If delay is zero, then non-blocking
read is used (i.e., read returns ERR if no input is waiting). If delay
is positive, then read blocks for delay milliseconds, and returns ERR
if there is still no input. Hence, these routines provide the same
functionality as nodelay, plus the additional capability of being able
to block for only delay milliseconds (where delay is positive).

[/code:1:af6f836b01]

Zsiraf

p.s.: RTFM

[quote:b78516a38f="miszterx"]Olyan problemam van, hogy azt szeretnem kikuszobolni hogy, ncurces.h alatti getch() valahogy NE VARJON, egy bill leutesere, csak akkor olvassa be egy valtozoba a getch megvaltozott erteket, ha tortent leutes, ha nem akkor ne csinaljon semmit fusson a ciklus tovabb. Erre valahogy nemtalaltam megoldast. Esetleg valaki tudna ra nekem egy fuggvenyt? vagy mas megoldast? Koszi elorre is.

Nekem anno a timeout(getch)/wtimeout(wgetch) oldotta meg a problémát. Ezek működéséről a [code:1:b78516a38f] man inopts[/code:1:b78516a38f] oldalon találsz leirást. Röviden annyi, hogyha a timeout értéke pozitív, a (w)getch megadot milisec után ERR -t ad vissza, ha nincs input. Ha az értéke 0, akkor nem vár inputra. Továbbá javallott még átnézni a libc dokumentációban a terminálkezelési részt( 17. Low-Level Terminal Interface )

szanom banom magam... :) minden esetre koszonom szepen a segitsegeket!! mostmar lesz mit olvasnom es gondolom meg is oldom. meg1szer thx

:) Megint talalkoztam par problemaval amire nem talalok megoldast. Es probaltam is utanaolvasni, dehat biztos rossz helyen keresem vagy nemtudom pontosan mit keresek.

szoval akkor sorban:
Kene vmi olyan fuggveny vagy megoldas, amivel tudnek kesleltetni. mint a pascalba volt a delay() ami milisecbe kesletetett. Mar neztem waitot delay-t sleepet, de semmi hasznalhato

A masik az hogy, szeretnek vhogy idomulassal manipulalni, ergo merni, hogy mennyi ideje fut a program, es a kezdes - eppen aktualis ido szerint egy ciklust lefuttatni. Itt mar ott van a time.h ott ott van a time(NULL), es difftime(vege,kezdete) felepitesbe, de az csak mp-be adja vissza es nekem az tul sok annal finomabban szeretnem a ciklust inditani.

Lecci segitsetek! Koszike!

[quote:2b9486c634="miszterx"]

szoval akkor sorban:
Kene vmi olyan fuggveny vagy megoldas, amivel tudnek kesleltetni. mint a pascalba volt a delay() ami milisecbe kesletetett. Mar neztem waitot delay-t sleepet, de semmi hasznalhato

usleep a Te függvényed. Kell neki valami include is, talán unistd.h.

Amúgy, az első problémádra egy olyan megoldáshoz mit szólnál, ha indítanál egy másik processzt, azaz fork(). Szerintem az nem olyan bonyolult, mint a multithreading, bár szvsz nehezebb a kommunikáció a processzek között, de hátha olyan a problémád, hogy nem is kell kommunikálni, amúgy meg a processzkezelést úgyis meg kell valamikor tanulnod, hát tanuld meg most :- ).

Hi!

Ajanlom a libc info felrakasat, es a nezegeteset. Minden ilyesmi le van dokumentalva.

man 2 gettimeofday

Egyebkent ha egy vegtelen ciklusban akarod nezni, hogy mikor ut le valaki egy billentyut, akkor azt felejtsd el, mert az multitask rendszerek eseten halott otlet. 100% CPU hasznalat, es egyeb kellemetlen mellekhatasok. A feladat latszolagos egyszerusege ellenere nezz utana a kapcsolos doloknak (terminalkezeles, signalkezeles, fork, multithread). Kesobb hasznat fogod venni.

By(t)e
TBS::Antiemes

[quote:48d72364cc="miszterx"]Kene vmi olyan fuggveny vagy megoldas, amivel tudnek kesleltetni. mint a pascalba volt a delay() ami milisecbe kesletetett. Mar neztem waitot delay-t sleepet, de semmi hasznalhato

Az usleep nem POSIX, érdemes megismerni az alarm() függvényt, bár elsőre kissé nehéz lehet (aztán a signal-okat)

[quote:48d72364cc="miszterx"]A masik az hogy, szeretnek vhogy idomulassal manipulalni, ergo merni, hogy mennyi ideje fut a program, es a kezdes - eppen aktualis ido szerint egy ciklust lefuttatni. Itt mar ott van a time.h ott ott van a time(NULL), es difftime(vege,kezdete) felepitesbe, de az csak mp-be adja vissza es nekem az tul sok annal finomabban szeretnem a ciklust inditani.

Nem értelek, mert a time az aktuális időt adja meg. Szerintem a times (esetleg getrusage, nem POSIX!) függvényeket keresed.

És érdemes megismerni az apropos (man -k) parancsot... ;)

[quote:e466169b9f="miszterx"]:) Megint talalkoztam par problemaval amire nem talalok megoldast. Es probaltam is utanaolvasni, dehat biztos rossz helyen keresem vagy nemtudom pontosan mit keresek.

szoval akkor sorban:
Kene vmi olyan fuggveny vagy megoldas, amivel tudnek kesleltetni. mint a pascalba volt a delay() ami milisecbe kesletetett. Mar neztem waitot delay-t sleepet, de semmi hasznalhato

A masik az hogy, szeretnek vhogy idomulassal manipulalni, ergo merni, hogy mennyi ideje fut a program, es a kezdes - eppen aktualis ido szerint egy ciklust lefuttatni. Itt mar ott van a time.h ott ott van a time(NULL), es difftime(vege,kezdete) felepitesbe, de az csak mp-be adja vissza es nekem az tul sok annal finomabban szeretnem a ciklust inditani.

Lecci segitsetek! Koszike!

nem tudom mennyiben lesz ez hasznos neked, de én esetleg ezekkel próbálkoznék (bár ncursesben nem értem hogyan nincs benne az amit keresel, slangot is nézted?):

nanosleep(2)
a másikra pedig
clock(3)

sok sikert (és kíváncsian várom a megoldásodat).

muttból egyébként sokat lehet tanulni, ha érdekel ez zajlik pl az ő menuloopjukban:

menu.c::mutt_menuLoop() --) menu.c::menu_dialog_dokey() --) curs_lib.c::mutt_getch()

utóbbiból az is kiderül hol van az a nyavalyás ctrl-g elrejtve. csak emiatt olvastam át a mutt egy nagy darab kódját, aztán mire végre megleltem rájöttem, hogy tullaképp annyira nem is idegesítő... végülis már annyira megszoktam... még akkor is, ha a muttos diktátor haxorok egy emacsos ökörséget erőltetnek rám. mindennek tetejébe egyébként jól el is van rejtve a manual.txt-ben az "editing input fields" alatt "abort" néven, de fel a kezekkel hányan olvastátok el a manual.txt-t az elejétől a végéig? :)

Olyan problemam van, hogy azt szeretnem kikuszobolni hogy, ncurces.h alatti getch() valahogy NE VARJON, egy bill leutesere, csak akkor olvassa be egy valtozoba a getch megvaltozott erteket, ha tortent leutes, ha nem akkor ne csinaljon semmit fusson a ciklus tovabb. Erre valahogy nemtalaltam megoldast. Esetleg valaki tudna ra nekem egy fuggvenyt? vagy mas megoldast? Koszi elorre is.

Hi!

Más megoldás, threading, legalábbis én azt olyankor szoktam használni, ha valami user inputot kell figyelni, és közben valamit csinálnia is kellene az adott processznek, de ezt szvsz csak bonyolultabb dolgoknál érdemes, biztos van ilyen függvény.

Link a multithreadhoz: http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html