本文主要是介绍【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下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!