当前位置: 首页 > news >正文

物流查询网站开发做网站友汇网

物流查询网站开发,做网站友汇网,国外在线crm系统suitecrm,有空间站的国家文章目录 背景介绍代码示例版本1-基本命令处理版本2-多线程命令处理,不阻塞主函数版本3-即使没有用户输入,也能立即退出 背景介绍 在开发命令行工具或控制台应用程序时,经常需要处理用户输入。常规做法是使用标准输入(stdin&…

文章目录

  • 背景介绍
  • 代码示例
    • 版本1-基本命令处理
    • 版本2-多线程命令处理,不阻塞主函数
    • 版本3-即使没有用户输入,也能立即退出

背景介绍

  • 在开发命令行工具或控制台应用程序时,经常需要处理用户输入。常规做法是使用标准输入(stdin)来获取用户输入的数据。常见的有C语言的getchar()、C++的std::getline()以及Windows API的ReadFile()等函数这些操作通常是阻塞的:它们会挂起调用线程,直到有数据可读或者发生某种错误。
  • 然而,在某些应用场景中,可能需要在没有用户输入的情况下优雅地退出应用程序。例如,当系统需要进行紧急停止或转入其他任务时,如果输入线程因等待getchar()或std::getline()而阻塞,则无法立即响应。这种情况下,需要一种机制来使得阻塞在标准输入上的读取操作能够立即返回,从而允许程序继续执行或安全退出。
  • 接下来将介绍一种实现方案,旨在解决如何让标准输入的阻塞读取在必要时能够立即返回,以提高程序的响应能力和用户体验。

代码示例

版本1-基本命令处理

std::cout << "Enter commands ('read' or 'write'). Type 'exit' to quit:" << std::endl;
std::string command;
while (std::getline(std::cin, command)) {if (command == "exit") {break;  // 用户输入exit时退出循环}else if (command == "read") {std::cout << "Reading data..." << std::endl;}else if (command == "write") {std::cout << "Writing data..." << std::endl;}else {std::cout << "Unknown command. Please try 'read' or 'write'." << std::endl;}
}

版本2-多线程命令处理,不阻塞主函数

std::atomic_bool keep_running = true;  // 控制线程运行的原子标志
// 创建一个处理输入的线程
std::thread input_thread([&]() {std::cout << "Enter commands ('read' or 'write'). Type 'exit' to quit:" << std::endl;std::string command;// 循环读取命令,直到收到停止信号while (keep_running && std::getline(std::cin, command)) {if (command == "exit") {keep_running = false;  // 设置标志以终止循环break;}else if (command == "read") {std::cout << "Reading data..." << std::endl;}else if (command == "write") {std::cout << "Writing data..." << std::endl;}else {std::cout << "Unknown command. Please try 'read' or 'write'." << std::endl;}}});std::this_thread::sleep_for(std::chrono::seconds(10)); // 模拟等待一段时间或等待其他事件触发
keep_running = false;  // 通知线程停止
input_thread.join();  // 等待线程完成
  • 相较于版本1,版本2通过增加多线程处理避免了主函数的阻塞,并使用了原子标志位以便用户可以控制何时退出线程。但仍存在不足,由于输入线程依赖于 std::getline 的阻塞性质,它必须等到接收到用户输入后才能检查退出条件,因此程序的完全退出还需要依赖于用户输入,用户不输入任何内容,即使修改了标志位也无法让线程退出。

版本3-即使没有用户输入,也能立即退出

// 使用原子标志来控制线程是否应该继续运行。
std::atomic_bool keep_running = true;
// 获取标准输入的句柄。
HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE);// 创建一个处理输入的线程。
std::thread input_thread([&]() {std::cout << "Enter commands ('read' or 'write'). Type 'exit' to quit:" << std::endl;// 循环读取命令,直到收到停止信号。while (keep_running) {char buffer[256] = { 0 };DWORD bytes_read = 0;// 阻塞地从标准输入读取数据。if (ReadFile(stdin_handle, buffer, sizeof(buffer) - 1, &bytes_read, nullptr)) {buffer[bytes_read] = '\0'; // 确保字符串是以null终止的。std::string command(buffer);// 解析命令并执行相应操作。if (command == "exit") {keep_running = false; // 设置标志以终止循环。break;}else if (command == "read") {std::cout << "Reading data..." << std::endl;}else if (command == "write") {std::cout << "Writing data..." << std::endl;}else {std::cout << "Unknown command. Please try 'read' or 'write'." << std::endl;}}else {// 如果ReadFile失败,则输出失败消息。// 此处假设失败是因为主动取消ReadFile。std::cout << "ReadFile failure, because we want it exit." << std::endl;}}});// 主线程等待一段时间或等待其他事件触发。
std::this_thread::sleep_for(std::chrono::seconds(10));
// 通知输入线程停止。
keep_running = false;
// 取消所有挂起的I/O操作,以确保ReadFile可以退出。
CancelIoEx(stdin_handle, nullptr);
// 等待输入线程完成。
input_thread.join();
  • 在版本3中,引入了 CancelIoEx 函数,这个函数用于取消指定文件句柄上所有未完成的输入/输出(I/O)操作。调用 CancelIoEx 后,所有挂起的 I/O 操作会被取消,任何阻塞的 ReadFile 调用都将返回失败。这种失败的检测使我们能够在不等待用户输入的情况下让 ReadFile 从阻塞状态返回。随后,程序会检查循环条件(例如 keep_running 标志),从而实现立即终止。
  • 为什么不使用 OVERLAPPED 结构和 WaitForMultipleObjects:
    • 同步属性的标准输入:标准输入(stdin)的句柄在大多数情况下是同步的,并且不支持真正的异步操作。尽管可以采用 OVERLAPPED 结构来异步读取,实际上 ReadFile 仍然表现为阻塞调用,这意味着无法通过事件来判断其可读状态。
    • 简单性与需求满足:当前使用同步阻塞调用已足够满足我们的需求,即能够实现快速退出。这种同步调用方法在逻辑上更加简单直接。
http://www.yayakq.cn/news/313920/

相关文章:

  • 网站建设360元起全包适合个人外贸平台
  • 福州门户网站目前网站开发怎么兼顾手机
  • 苏州网站建设代理渠道做奢侈品回收网站特点
  • 上海建设网站制万界商城系统
  • 南通模板建站多少钱网站图片上浮动文字
  • 微信群二维码大全网站手机百度网站建设
  • 好的模板网站推荐怎样做二维码网站
  • 简单网站制作教程网页设计师培训费用
  • 如何做网站链接分享朋友圈深圳亿天联网站建设
  • 常州做网上废品收购网站网站不用备案
  • 网站制作小工具南宁网站建设网站建设
  • 做风险代理案源的网站wordpress 在线知识库
  • 海林建设局网站聊城网站建设价位
  • 厦门网站建设cnmxcm服务器 空间 虚拟主机 网站需要
  • 网站建设logo显示怎么设置社交网站建设网
  • 重庆网站推广营销代理做外贸是网站好还是展会好
  • 重庆企业网站制作外包wordpress模板开发 2016
  • 做网站做推广查pv uv的网站
  • 苏州外贸网站制作公司几个小时学wordpress
  • 那种系统做网站比较好在中国如何申请域名
  • 用服务器ip可以做网站吗网站更换空间改版收录
  • 大学生做网站步骤成都短视频代运营公司
  • 花生壳做局域网站电影网
  • Django可以做门户网站吗中文旅游网站html模板
  • 企业搭建pc端网站当地做网站贵
  • 门户网站域名是什么意思深圳 网站设计公司排名
  • 邗江建设局网站资料下载百度快速收录教程
  • 湖州北京网站建设化工外贸网站建设
  • 网站搜索网站联盟系统
  • 网站百度收录秒收方法百度一下就知道官方网站