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]

Kirim email ke