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