아래 코드를 사용해 보았습니다. 변수를 연속적으로 인쇄합니다. stderr를 사용해야했습니다. stdout은 프로그래머가 명시 적으로 요청할 때 또는 가장 편리한 경우 stderr가 메시지를 즉시 기록 할 때 v 퍼를 플러시합니다. 터미널의 표준 모드로 인해 사용자 입력을 확인하려면 enter 키를 눌러야합니다. 정식 모드는 코드의 비 블로킹 실행에 대해 비활성화되어야합니다. 정식 모드는 항상 사용자 입력을 확인하기 위해 입력을 기다리는 것을 의미합니다. 그게 당신의 경우가 아니라면, nonblock 그 기능을 제공합니다. 나는 그것을 나 자신으로 이해하지 못한다. 다른 포럼의 코드와 설명을 얻었습니다.
#include<stdio.h>
#include<curses.h>
#include<unistd.h>
#include <termios.h>
#include <sys/time.h>
#define NB_ENABLE 0x01
#define NB_DISABLE 0x00
int kbhit()
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &fds);
}
void nonblock(int state)
{
struct termios ttystate;
tcgetattr(STDIN_FILENO, &ttystate); //get the terminal state
if (state==NB_ENABLE)
{
//turn off canonical mode
ttystate.c_lflag &= ~ICANON;
//minimum of number input read.
ttystate.c_cc[VMIN] = 1;
}
else if (state==NB_DISABLE)
{
//turn on canonical mode
ttystate.c_lflag |= ICANON;
}
//set the terminal attributes.
tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
}
int main()
{
char c,i;
while(c != 27)
{
usleep(10000);
vUpdateVariable(); // routine to update the current value of variable
printf(stderr,"Value is %f\r", fVariable);
i=kbhit();
c=fgetc(stdin);
}
nonblock(NB_DISABLE);
return 0;
}
getchar는 차단 호출입니다. 이것은 Linux 또는 Windows 또는 다른 OS에 있습니까? Windows에서는 _kbhit을 사용하십시오. Linux에서는 ioctl로 설정하거나 터미널 속성을 수정해야합니다. – cup
Linux의 경우 [여기] (http://stackoverflow.com/questions/448944/c-non-blocking-keyboard-input)를 참조하십시오. Windows의 경우 [여기] (http://stackoverflow.com/questions/3643738/how-to-read-available-input-without-blocking-on-windows?rq=1)를 참조하십시오. – herohuyongtao
@starsplusplus 잘못된 중복입니다. OP가 C를 지정할 때 C++에서 중복되는 것을 좋아하지 마십시오. – Lundin