Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro
Verwijderd
Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.
[ Voor 79% gewijzigd door H!GHGuY op 03-01-2004 17:30 . Reden: fout ]
ASSUME makes an ASS out of U and ME
Zal vanavond gaan zoeken, als iemand anders tijd heeftVerwijderd schreef op 03 januari 2004 @ 17:18:
Dit kan volgens mij niet met een standaard-c functie, maar onder Linux kan de misschien select() gebruiken om te kijken of er een toets is ingedrukt.
Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.
Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro
Verwijderd
http://www.google.com/sea...d=navclient&q=kbhit+linux
eerste resultaat:
http://linux-sxs.org/programming/kbhit.html
denk dat je daar aardig ver mee komt.
Je kunt een programma sowieso altijd afbreken met Ctrl-C, en daar hoef je dan verder ook niet allerlei vreemde dingen voor te doen...
Wat de TS wil is een non line-buffered terminal. Met blocking IO heeft dit probleem niks te maken. Met tcgetattr() / tcsetattr() kun je de diverse terminal modes zetten.Verwijderd schreef op 03 januari 2004 @ 17:18:
Wat je wil heet "non-blocking i/o", misschien kan je daaronder zoeken.
Voor degenen die echt gehecht zijn aan DOS : Er zijn wat ports van de Borland conio funties, wat zoekwerk op google zou deze snel tevoorschijn moeten toveren.
[ Voor 25% gewijzigd door igmar op 04-01-2004 00:28 . Reden: typos ]
Verwijderd
Waarmee je nog steeds de input per regel krijgt. En het nut van de poll / select is in deze ?
Ik denk dat de oplossing toch in deze post zitVerwijderd schreef op 03 januari 2004 @ 17:48:
google: 'kbhit linux':
http://www.google.com/sea...d=navclient&q=kbhit+linux
eerste resultaat:
http://linux-sxs.org/programming/kbhit.html
denk dat je daar aardig ver mee komt.
Ik heb namelijk dit uit het eerste resultaat uitgevoerd:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| kbhit() is not available on Linux (UNIX), it is a DOS function.
Below is some code (functions) to replace the "kbhit" functionality (this
code is from a book called "Beginning Linux Programming", from Wrox Press
-- www.wrox.com -- you can download the Code Examples from the Book at
this Site):
CCODE
/********************************************************************/
KBHIT.H
#ifndef KBHITh
#define KBHITh
void init_keyboard(void);
void close_keyboard(void);
int kbhit(void);
int readch(void);
#endif
KBHIT.C
#include "kbhit.h"
#include <termios.h>
#include <unistd.h> // for read()
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
unsigned char ch;
int nread;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
} |
De functie kbhit() heb ik dus in mijn file gezet, en ik controleer met
1
| while (!kbhit()){ |
Nu heb ik nog 2 problemen:
- Hoe kan ik controleren of er op de q is gedrukt en niet op een andere toets?
(- Hoe zorg ik ervoor dat na het uitvoeren van het programma de instellingen van de terminal weer normaal zijn, door die kbhit word namelijk ingesteld dat er geen enters meer voorkomen in de terminal en ook word er niks meer geecho'ed. Dat is dus erg lastig met een opdracht intypen, omdat je dus niks ziet behalve:
[code][user@localhost map]#
[/code])
Al opgelost, door de functies init_keyboard(); en close_keyboard(); toe te voegen
Nu dus alleen probleem 1 nog.
[ Voor 13% gewijzigd door RHE123 op 04-01-2004 12:30 ]
Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro
1
2
3
4
5
6
| while(true) {
if (kbhit()) {
if (readch()==int('q')) break;
}
// rest van de code
} |
begint trouwens meer op een p&w vraagje te lijken
Thnx, ik heb hem nu werkendShadowman schreef op 04 januari 2004 @ 12:39:
als je die kbhit true terug geeft kun je controleren met de readch of er een q terug wordt gegeven.
code:
1 2 3 4 5 6while(true) { if (kbhit()) { if (readch()==int('q')) break; } // rest van de code }
offtopic:
begint trouwens meer op een p&w vraagje te lijken
edit: Met welke opdracht kan ik eigenlijk het script beeindigen, want break (zoals hier in de code) werkt niet. Het gaat dus om het hele script, en niet een loop ofzo.
[ Voor 21% gewijzigd door RHE123 op 04-01-2004 14:14 ]
Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro
Verder, basis C kennis:
1
| exit(int code); |
All my posts are provided as-is. They come with NO WARRANTY at all.
Dat d8 ik dus ook, maar hij scheid er mooi niet mee uitCyBeR schreef op 04 januari 2004 @ 16:25:
C != script, dat ten eerste.
Verder, basis C kennis:
code:
1 exit(int code);
Ik werk onder linux (weet niet of dat uitmaakt..), en wat kan je voor int invoeren?
Het is al gelukt, had exit op de verkeerde plek aangepast
[ Voor 11% gewijzigd door RHE123 op 04-01-2004 17:13 ]
Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro