1. 程式人生 > 其它 >【C語言進階】windows下的多執行緒該怎麼實現?附實戰:實現一邊倒計時一邊輸入單詞

【C語言進階】windows下的多執行緒該怎麼實現?附實戰:實現一邊倒計時一邊輸入單詞

技術標籤:實戰經驗c語言

將會解決的問題

① 建立多個執行緒(倒計時與輸入同時進行)
② 改變游標的位置
③ 刪除控制檯上已經輸出的字元


在最近的程式設計中,遇到了這麼一個問題:

在一個英語單詞拼寫程式中,想要新增一個計時功能:給出一個計時器顯示倒計時,當時間到了如果還沒成功拼寫便切到下一個單詞

這個功能乍一看感覺不難,也就是新建一個迴圈每秒將預定時間減少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海星,第五篇完畢!(寒冰小澈)