非阻塞输入 C

Non blocking input C

我正在尝试创建一个程序,向用户提出问题并有几秒钟的时间回答问题,否则程序会停止输入。

现在我的问题是我无法让我的程序不阻止输入。 我可以输入数据,但是当我不输入并且计时器用完时,它会一直要求输入。

我 运行 在 Windows 并使用 Code::Blocks 以防它很重要。 如果有人能向我解释我做错了什么,将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <conio.h>

int key = 0;
int GradeTotal = 0;

//runs an empty loop every iteration F.E. for loop
void timer(int seconds)
{
    clock_t wait = (clock() + (seconds * CLOCKS_PER_SEC));
    while(clock() < wait){}

}

void timeleft()
{
    int index;

    for(index = 5; index >= 0; index--)
    {
        if(key != 0)
        {
            pthread_exit(timeleft);
        }

        timer(1);

        if(index == 0)
        {
        printf("\n\nTime's up!");
        }
    }
}

void questions()
{
    int key;

    printf("what is 1 + 1?\nAnswer: ");

    while(1)
    {
        if(_kbhit())
        {
            key = _getch();
            printf("%c",key);
            break;
        }
    }
    if(key == 50)
    {
         GradeTotal += 1;
    }  
 }


int main()
{
    pthread_t thread1,thread2;

    int index;
    int seconds = 0;
    pthread_create(&thread1, NULL, questions, NULL);
    pthread_create(&thread2, NULL, timeleft, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("\n\nGrade: %d",GradeTotal);

    return 0;
}

当时间 运行 结束时,timeleft() 设置一个全局标志,由 questions() 测试,如果设置使代码离开 while (1) 循环。

确保使用互斥体保护对标志的访问。

谈论"protected access":key是在没有保护的情况下并发访问的。不好。

这个例子使用了pthread的特性来设置一个定时器,如果出现问题就取消线程,我没有检查这个例子中的任何错误。在实际应用中,你必须这样做:

#include <stdio.h>
#include <pthread.h>
#include <time.h>

void *wrapper_handle_question(pthread_cond_t *cond) {
  char buf[2048];
  size_t i = fread(buf, 1, sizeof buf - 1, stdin);
  buf[i] = '[=10=]';
  printf("%s", buf);
  pthread_cond_broadcast(cond);
  return NULL;
}

void *handle_question(void *arg) { return wrapper_handle_question(arg); }

int main(void) {
  pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  pthread_t question;
  pthread_create(&question, NULL, &handle_question, &cond);

  struct timespec ts;
  clock_gettime(CLOCK_REALTIME, &ts);
  ts.tv_sec += 5;

  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  pthread_mutex_lock(&mutex);

  int rc = pthread_cond_timedwait(&cond, &mutex, &ts);
  pthread_mutex_unlock(&mutex);
  if (rc == 0) {
    pthread_join(question, NULL);
  } else {
    pthread_cancel(question);
    printf("timeout!\n");
  }
}