【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

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭