【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词

本文主要是介绍【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将会解决的问题

① 创建多个线程(倒计时与输入同时进行)
② 改变光标的位置
③ 删除控制台上已经输出的字符


在最近的程序设计中,遇到了这么一个问题:

在一个英语单词拼写程序中,想要添加一个计时功能:给出一个计时器显示倒计时,当时间到了如果还没成功拼写便切到下一个单词

这个功能乍一看感觉不难,也就是新建一个循环每秒将预定时间减少1,然后打印出来。

但很快问题出来了,如果要计时,就必须在循环里边不断打印,无法执行输入语句,同样要执行输入语句就没办法计时。


该怎么解决?

答案就是使用多线程,将倒计时放在一个线程,输入单词放在另一个线程,这样就解决了上面的问题

实现多线程

① 需要的头文件:
include <process.h> 实现多线程
beginthread(start_address, stack_size, arglist); 创建一个线程
# 百度:
– start_address:新线程的起始地址 ,指向新线程调用的函数的起始地址
– stack_size:新线程的堆栈大小,可以为0
– arglist:传递给线程的参数列表,无参数时为NULL

endthread(); 结束一个线程

include <windows.h> 实现线程休眠
Sleep(1000); 休眠1秒

② 实现倒计时一边输入单词

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#include <conio.h>void inputc(void*);
void timec(void*);
void gotoxy(int x, int y);int isrun = 1;  //控制主线程运行或结束
int timerest = 10;  //设置初始时间
char word[10];  //接收单词输入int main()
{_beginthread(timec, 0, NULL);  //启动倒计时显示线程_beginthread(inputc, 0, NULL);  //启动输入单词线程while (isrun);  //阻塞主线程,让子线程执行return 0;
}//显示信息
void update()
{gotoxy(0, 0);printf("\n\n  剩余时间:%d s", timerest);printf("\n\n  中文:你好");printf("\n\n                         ");  //清空这一行gotoxy(0, 4);printf("\n\n  英文:%s", word);  //重新显示
}//输入控制线程
void inputc(void*)
{int i = 0;char ch;  //单个输入检查while (1)  //执行输入{ch = _getch();  //读取字符if (ch=='@')  //检查是否退出{isrun = 0;  //输入@,结束主线程,即程序结束_endthread();}if (ch == '\b')  //检测是否为退格{if (i > 0){word[--i] = 0;  //是的话将一个字符删掉并向前移动一位putchar('\b');putchar(' ');putchar('\b');  //这三句实现删掉已经输出的字符}}else{word[i] = ch;  //放进数组putchar(ch);i++;  //不是则向下移动并输出}if (ch == '\n')  //检查是否输入完毕{if (strcmp(word, "hello"))  //判断输入是否正确{/* ... */}word[0] = 0;i = 0;  //还原数组}}
}//时间控制线程
void timec(void*)
{timerest = 10;while (timerest > 0)  //倒计时{timerest--;update();  //刷新Sleep(1000);  //每秒执行一次}_beginthread(timec, 0, NULL);  //重新启动倒计时显示线程_endthread();  //关闭当前线程
}//改变光标位置
void gotoxy(int x, int y)
{// 更新光标位置COORD pos;HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);pos.X = x;pos.Y = y;SetConsoleCursorPosition(hOutput, pos);
}

运行结果;

其余知识点
(1) gotoxy() 改变光标位置
(2)putchar('\b'); putchar(' '); putchar('\b'); 三句可以删除控制台上已打印的字符

总结

线程建立一共就两步,一是beginthread创建线程,传入需要执行的函数名,必要时可以传入参数,最后以endthread结束线程。
需要注意的是阻塞主线程,不然主线程一结束就整个程序都结束了,看不到效果。


ohhhh海星,第五篇完毕!(寒冰小澈)

这篇关于【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759419

相关文章

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

windows下安装Nginx全过程

《windows下安装Nginx全过程》文章介绍了HTTP和反向代理服务器的概念,包括正向代理和反向代理的区别,并详细描述了如何安装和配置Nginx作为反向代理服务器... 目录概念代理正向代理反向代理安装基本属性nginx.conf查询结构属性使用运行重启停止总结概念是一个高性能的HTTP和反向代理we

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp