On Mon, Oct 30, 2000 at 11:31:21AM +0000, Benny Prijono wrote:
> no no, yg. diinginkan adalah non-blocking.
Ah .. thanks .. saya memang nggak baca topik ini bener-bener :-)
Posting saya kemarin, sebenarnya menanggapi soal kbhit() yang saya
pikir, cuman nunggu input sampai user menekan keyboard saja. Untung
ada dua rekan bilang 'non-blocking' membuat saya jadi lihat lagi
mail-mail yang lain he..he..he..
> btw, kembali ke masalah asal, IMO solusi kbhit() kayaknya kok nggak
> terlalu bagus. Nanti ujung-ujungnya pasti memakai busy-loop, yg.
> memakan resource CPU. Dan jangan lupa, kalau kita ngambil karakter
> satu-satu, berarti program kita harus menangani penekanan tombol2
> khusus seperti backspace, ENTER (dan arrow dan del juga kalau mau
> canggih).
Benar. Yang susah justru nanti pas nunggu pesan dari server (via
socket?) yang mesti juga dibuat non-blocking .. doh :-)
Fungsi do_other_things() bisa dipakai untuk menunggu pesan dari
server. Karena, asumsi saya, hanya ada dua socket untuk input, maka
select() tidak saya masukkan ke kbhit(), mestinya akan diperlukan di
do_other_things() (ada komentar?)
Berikut ini hasil kerpekan:
#include <stdio.h>
#include <termio.h>
#include <errno.h>
#include <fcntl.h>
void do_other_things(void) {
sleep(1);
fprintf(stdout,"sambil nunggu input server\n");
}
void kbhit(void) {
char in, outbuf[20];
struct termio save, term;
int nchar, block;
block = fcntl (0,F_GETFL, 0);
fcntl(0,F_SETFL,block|O_NDELAY);
if (ioctl(0, TCGETA, &term) < 0) exit(errno);
save = term;
term.c_lflag &= ~ICANON;
term.c_lflag &= ~ECHO;
term.c_cc[VMIN] = 1;
term.c_cc[VTIME] = 0;
ioctl(0, TCSETA, &term);
do {
do_other_things();
nchar = read(0,&in,1);
if (nchar) sprintf(outbuf,"ini input user: %c\n", in);
write(1,outbuf,strlen(outbuf));
} while (in != 'q');
ioctl(0, TCSETA, &save);
fcntl(0, F_SETFL, block);
return;
}
int main()
{
kbhit(); /* sorry namanya masih kbhit() :-) */
}
Dugaan saya sih, di library ncurses sudah ada fungsi yang membuat
stdin non-blocking. Dari pada menggali sumur baru ...
Salam,
P.Y. Adi Prasaja
--------------------------------------------------------------------------------
Utk berhenti langganan, kirim email ke [EMAIL PROTECTED]
Informasi arsip di http://www.linux.or.id/milis.php3
Pengelola dapat dihubungi lewat [EMAIL PROTECTED]