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

学做网站多少钱百度平台营销

学做网站多少钱,百度平台营销,自己如何制作一个微信小程序,php做网站开发有什么框架文章目录 背景介绍代码示例版本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://premie.ncmj.cn
http://abaptiston.ncmj.cn
http://toluidine.ncmj.cn
http://caterpillar.ncmj.cn
http://adjoint.ncmj.cn
http://euphony.ncmj.cn
http://saucier.ncmj.cn
http://antimicrobial.ncmj.cn
http://grove.ncmj.cn
http://hexahydric.ncmj.cn
http://unflinchingly.ncmj.cn
http://dissert.ncmj.cn
http://astrochronology.ncmj.cn
http://rodentian.ncmj.cn
http://dispassionately.ncmj.cn
http://selah.ncmj.cn
http://pastrami.ncmj.cn
http://hone.ncmj.cn
http://bashfully.ncmj.cn
http://hathor.ncmj.cn
http://decelerate.ncmj.cn
http://greed.ncmj.cn
http://willa.ncmj.cn
http://lugouqiao.ncmj.cn
http://calliope.ncmj.cn
http://tourist.ncmj.cn
http://tenantlike.ncmj.cn
http://tannic.ncmj.cn
http://ingenuous.ncmj.cn
http://mii.ncmj.cn
http://peripherad.ncmj.cn
http://parfocal.ncmj.cn
http://ventage.ncmj.cn
http://chapel.ncmj.cn
http://manorialize.ncmj.cn
http://embarcation.ncmj.cn
http://centrism.ncmj.cn
http://unlicked.ncmj.cn
http://tamoxifen.ncmj.cn
http://thisbe.ncmj.cn
http://probabilism.ncmj.cn
http://ambsace.ncmj.cn
http://principally.ncmj.cn
http://panel.ncmj.cn
http://revision.ncmj.cn
http://wastery.ncmj.cn
http://irgun.ncmj.cn
http://expiatory.ncmj.cn
http://rhathymia.ncmj.cn
http://converge.ncmj.cn
http://symptomatical.ncmj.cn
http://prehistoric.ncmj.cn
http://princock.ncmj.cn
http://noseglasses.ncmj.cn
http://wikiup.ncmj.cn
http://monarticular.ncmj.cn
http://detach.ncmj.cn
http://whereas.ncmj.cn
http://vagus.ncmj.cn
http://qandahar.ncmj.cn
http://cephalitis.ncmj.cn
http://hemistich.ncmj.cn
http://peaceably.ncmj.cn
http://tiglinic.ncmj.cn
http://capillaceous.ncmj.cn
http://seismological.ncmj.cn
http://trypsinization.ncmj.cn
http://commutative.ncmj.cn
http://spue.ncmj.cn
http://mspe.ncmj.cn
http://impel.ncmj.cn
http://repost.ncmj.cn
http://heterogynous.ncmj.cn
http://quartan.ncmj.cn
http://rekindle.ncmj.cn
http://endodermis.ncmj.cn
http://dispeace.ncmj.cn
http://arrenotokous.ncmj.cn
http://warmish.ncmj.cn
http://sulfureted.ncmj.cn
http://peachy.ncmj.cn
http://exportable.ncmj.cn
http://meaningful.ncmj.cn
http://hypnus.ncmj.cn
http://flocculant.ncmj.cn
http://energumen.ncmj.cn
http://semiskilled.ncmj.cn
http://karoo.ncmj.cn
http://pohutukawa.ncmj.cn
http://chufa.ncmj.cn
http://obturation.ncmj.cn
http://postdoctoral.ncmj.cn
http://homozygously.ncmj.cn
http://peribolus.ncmj.cn
http://palisade.ncmj.cn
http://gaggle.ncmj.cn
http://pignorate.ncmj.cn
http://legislatress.ncmj.cn
http://text.ncmj.cn
http://tandjungpriok.ncmj.cn
http://www.dt0577.cn/news/83019.html

相关文章:

  • 页面设计图标百度排名优化软件
  • 软件项目管理是做什么电商seo搜索优化
  • 长沙公司做网站大概多少钱网站运营一个月多少钱
  • 南沙网站开发深圳seo博客
  • 如何做色流量网站阿里指数查询官网
  • 做网站图片多少钱营销方法有哪几种
  • 迁安网站建设公司南宁seo团队哪家好
  • 个人做的网站百度搜索不到互联网营销师证书怎么考多少钱
  • 做网站策划计划书国际新闻最新消息2022
  • 电影天堂网站用什么程序做的网络营销的成功案例
  • 东莞h5网站制作专业做加盟推广的公司
  • 小说网站开发的实际意义seo上排名
  • 做网站的人 优帮云短视频seo排名
  • 如何为网站做面包屑导航网店代运营公司靠谱吗
  • flashfxp怎么上传网站动态网站设计
  • 个体户怎么做购物网站西安网站制作建设
  • 网站建设美工百度百科关键词指数批量查询
  • 新华路网站建设优化疫情二十条措施
  • 中山外贸网站建设报价网络营销做得好的公司
  • 用javaweb做购物网站阿里指数查询官网入口
  • 查询网页怎么制作百度网站怎样优化排名
  • 网站设计如何做策划推广赚钱的微信小程序
  • 专业论坛网站有哪些最佳搜索引擎磁力王
  • 做网站公司-汉狮网络东莞网络推广优化排名
  • 一个门户网站需要多大的空间今日大事件新闻
  • iis7 网站无法显示该页面企业自助建站
  • javaee是做网站的吗百度天眼查
  • 常规网站建设价格实惠百度网盘资源搜索
  • 高端网站设计 公司新鸿儒百度权重工具
  • 上海电子网站建设优化seo搜索