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

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

2023年6月22日发(作者:)

【C语⾔进阶】windows下的多线程该怎么实现?附实战:实现⼀边倒计时⼀边输⼊单词将会解决的问题① 创建多个线程(倒计时与输⼊同时进⾏)② 改变光标的位置③ 删除控制台上已经输出的字符在最近的程序设计中,遇到了这么⼀个问题:在⼀个英语单词拼写程序中,想要添加⼀个计时功能:给出⼀个计时器显⽰倒计时,当时间到了如果还没成功拼写便切到下⼀个单词这个功能乍⼀看感觉不难,也就是新建⼀个循环每秒将预定时间减少1,然后打印出来。但很快问题出来了,如果要计时,就必须在循环⾥边不断打印,⽆法执⾏输⼊语句,同样要执⾏输⼊语句就没办法计时。该怎么解决?答案就是使⽤多线程,将倒计时放在⼀个线程,输⼊单词放在另⼀个线程,这样就解决了上⾯的问题实现多线程① 需要的头⽂件:include 实现多线程beginthread(start_address, stack_size, arglist); 创建⼀个线程# 百度:– start_address:新线程的起始地址 ,指向新线程调⽤的函数的起始地址– stack_size:新线程的堆栈⼤⼩,可以为0– arglist:传递给线程的参数列表,⽆参数时为NULLendthread(); 结束⼀个线程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; return 0;}//显⽰信息void update(){ gotoxy(0, 0); printf("nn 剩余时间:%d s", timerest); printf("nn 中⽂:你好"); printf("nn "); //清空这⼀⾏ gotoxy(0, 4); printf("nn 英⽂:%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); //每秒执⾏⼀次 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海星,第五篇完毕!(寒冰⼩澈)

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687426555a9198.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信