有人問到線程相關的問題,線程其實是一個蠻複雜的東西,我也還沒完全搞懂。不過我這邊以glib提供的線程函式庫來做一個範例。
先簡單介紹一下線程的概念,線程就是讓同一個程式能同時執行多件任務的結構,比如我要一邊更新畫面,一邊又能受使用者操作,如果沒有線程,在等待使用者輸入的時候就會卡住(block),直到使用者輸入完才回繼續。線程讓兩件事能同時進行。
在每個作業系統中,有提供不同的線程的函式庫,在linux等posix作業系統,有pthread可使用,在這裡我是選用跨平台的glib提供的gthread作為範例。
搭建開發平台我想是初學者最不容易學習的過程,搭建完成後打幾行程式按下F9倒是簡單。不過這個搭建的過程讓你再調用其他函式庫也能順利完成。
把它解壓縮。
接下來用devc++開一個新的專案,專案右鍵點專案選項,在檔案/目錄那個分頁,函式庫目錄加上[你解壓的資料夾]lib,引入標頭檔目錄加上[你解壓的資料夾]include\glib-2.0
在專案選項裡面的參數那個分頁,編譯器那欄輸入-mms-bitfields -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include,連結器那欄輸入-lgthread-2.0 -lglib-2.0 -lintl 。
接下來可以開始寫code了,我這裡的範例程式是要一直輸出'*'字號,當使用者按'a'的時候,輸出的'*'的前面的空格會增多,按's'的時候,輸出的'*'的前面空格會減少,按'q'結束程序。
範例程式及註解:
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>/*使用的glib函式庫需引入的標頭檔案*/
#include <conio.h>/*getch()所需引入的標頭檔案*/
int space_num=0;/*'*'字號前面的空格數*/
void inthread()/*線程所運行的函數,內容為印出空格space_num個空格,及'*'字號*/
{
while(1)
{
int i;
for(i=0;i<space_num;i++)
{
printf(" ");
}
g_usleep(50000);/*每次印出休息50000微秒*/
printf("*\n");
}
}
int main(int argc, char *argv[])
{
g_thread_init(NULL);/*在使用線程前須先使用此函式,傳入NULL,官方文檔:Do not call g_thread_init() with a non-NULL parameter unless you really know what you are doing.*/
g_thread_create(inthread,NULL,FALSE,NULL);/*用我們寫好的函式做為參數,開啟線程,可以想像為程式分出一線去執行剛剛那個函式,在main裡面也繼續運行下去。*/
char a;
while(1)
{
char key;
key=getch();/*用getch()獲取鍵盤輸入,並增加/減少空白數,或離開*/
if(key=='a')
{
space_num++;
}
else if(key=='s')
{
space_num--;
}
else if(key=='q')
{
return 0;
}
}
return 0;
}
這只是一個簡單的範例,線程還有其他更複雜的知識跟功能,如果大家有找到更多的資料歡迎提供。