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

您所在的位置:网站首页 c语言多线程实现 【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词

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

2024-01-04 02:51| 来源: 网络整理| 查看: 265

将会解决的问题

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

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

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

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

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

该怎么解决?

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

实现多线程

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

include 实现线程休眠 Sleep(1000); 休眠1秒

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

#include #include #include #include #include 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海星,第五篇完毕!(寒冰小澈)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3