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

将会解决的问题

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


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

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

这个功能乍一看感觉不难,也就是新建一个循环每秒将预定时间减少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);
}

运行结果;
【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词_第1张图片 【C语言进阶】windows下的多线程该怎么实现?附实战:实现一边倒计时一边输入单词_第2张图片

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

总结

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


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

你可能感兴趣的:(实战经验,c语言)