You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++测验程序中如何实现倒计时与测验逻辑同时运行?

解决C++测验程序中倒计时与题目同步运行的问题

我懂你碰到的这个痛点——单线程下的C++程序是逐行执行的,要么卡在等待用户输入的步骤,要么自顾自跑倒计时,没法让两者同时进行。本质原因是默认的cin/cout这类IO操作是阻塞式的,一旦程序走到输入环节,就会停下来等用户输入,倒计时自然就停了。下面给你几个可行的解决方法,结合你的代码片段来调整:

方案1:使用C++标准库多线程(std::thread)

这是最通用的现代C++解决方案,把倒计时逻辑放到单独的线程里运行,主线程专注处理题目和用户输入。需要注意线程之间的同步,比如用原子变量标记答题是否完成,避免倒计时线程无限跑下去。

修改你的OOP2函数示例:

#include <thread>
#include <atomic>
#include <iostream>
#include <chrono>

void QUIZ::OOP2() {
    system("cls");
    QUIZ("OOP2");
    int oop2_time = 100;
    std::atomic<bool> is_answered(false); // 标记是否完成答题

    // 倒计时线程函数
    auto countdown_thread = std::thread([&]() {
        while (oop2_time >= 0 && !is_answered) {
            // 用\r让倒计时覆盖同一行,避免刷屏
            std::cout << "\r\t\t\t剩余时间:" << oop2_time << "秒" << std::flush;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            oop2_time--;
        }
        if (oop2_time < 0) {
            std::cout << "\n\t\t\t时间到!自动提交答案\n";
            is_answered = true;
            // 这里可以添加时间到后的处理逻辑,比如自动判分
        }
    });

    // 主线程显示题目并处理输入
    std::cout << "\t\t\tQuestions of OOP2\n\n";
    line();
    std::cout << "1. Switch selection structure can be used to represent any kind of if-else selection structure? \n";
    std::cout << "请输入答案(A/B/C/D):";
    char answer;
    std::cin >> answer;
    is_answered = true; // 答题完成,通知倒计时线程停止

    // 等待倒计时线程结束
    if (countdown_thread.joinable()) {
        countdown_thread.join();
    }

    // 后续处理答案逻辑...
}

注意:多线程下使用cout要注意线程安全,必要时可以加std::mutex保护输出操作,避免内容混乱。

方案2:非阻塞输入+轮询(不需要多线程)

如果你不想用多线程,可以用系统相关的非阻塞输入函数,在循环里同时检查用户输入和更新倒计时。这种方法的缺点是跨平台性稍差,Windows和Linux的API不一样:

Windows平台示例:

#include <conio.h> // 提供_kbhit()和_getch()
#include <chrono>
#include <thread>

void QUIZ::OOP2() {
    system("cls");
    QUIZ("OOP2");
    int oop2_time = 100;
    char answer = '\0';
    bool is_answered = false;

    std::cout << "\t\t\tQuestions of OOP2\n\n";
    line();
    std::cout << "1. Switch selection structure can be used to represent any kind of if-else selection structure? \n";
    std::cout << "请输入答案(A/B/C/D):";

    while (oop2_time >= 0 && !is_answered) {
        // 检查是否有按键输入
        if (_kbhit()) {
            answer = _getch();
            is_answered = true;
            std::cout << answer << "\n"; // 回显用户输入
        }
        // 更新倒计时显示
        std::cout << "\r\t\t\t剩余时间:" << oop2_time << "秒" << std::flush;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        oop2_time--;
    }

    if (!is_answered) {
        std::cout << "\n\t\t\t时间到!\n";
    } else {
        // 处理用户答案逻辑...
    }
}

Linux/macOS平台示例:

需要用select()函数来实现非阻塞输入:

#include <sys/select.h>
#include <unistd.h>
#include <chrono>
#include <thread>

// 检查是否有输入
bool has_input() {
    fd_set set;
    FD_ZERO(&set);
    FD_SET(STDIN_FILENO, &set);
    struct timeval tv = {0, 0};
    return select(STDIN_FILENO + 1, &set, nullptr, nullptr, &tv) == 1;
}

void QUIZ::OOP2() {
    system("clear");
    QUIZ("OOP2");
    int oop2_time = 100;
    char answer = '\0';
    bool is_answered = false;

    std::cout << "\t\t\tQuestions of OOP2\n\n";
    line();
    std::cout << "1. Switch selection structure can be used to represent any kind of if-else selection structure? \n";
    std::cout << "请输入答案(A/B/C/D):";

    while (oop2_time >= 0 && !is_answered) {
        if (has_input()) {
            std::cin >> answer;
            is_answered = true;
        }
        std::cout << "\r\t\t\t剩余时间:" << oop2_time << "秒" << std::flush;
        std::this_thread::sleep_for(std::chrono::seconds(1));
        oop2_time--;
    }

    if (!is_answered) {
        std::cout << "\n\t\t\t时间到!\n";
    } else {
        // 处理答案逻辑...
    }
}

方案3:使用终端控制库(如ncurses)

如果想做更专业的终端界面(比如把倒计时固定在屏幕右上角,题目在中间),可以用ncurses这类库,它能直接控制终端的光标位置和窗口,实现更灵活的界面布局。

简单示例思路:

  1. 初始化ncurses环境(initscr())
  2. 创建两个窗口:一个显示题目,一个显示倒计时
  3. 在循环中,每隔1秒更新倒计时窗口的内容
  4. 同时监听用户输入,一旦有输入就处理并退出循环
  5. 最后结束ncurses环境(endwin())

这个方案的优点是界面更友好,缺点是需要额外安装ncurses库,学习成本稍高。


内容的提问来源于stack exchange,提问作者Dadakhon Ortikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:00:40