[程式]基本線程調用

20 views
Skip to first unread message

cpyi

unread,
Jan 27, 2013, 5:17:30 AM1/27/13
to code_fellow...@googlegroups.com
有人問到線程相關的問題,線程其實是一個蠻複雜的東西,我也還沒完全搞懂。不過我這邊以glib提供的線程函式庫來做一個範例。
先簡單介紹一下線程的概念,線程就是讓同一個程式能同時執行多件任務的結構,比如我要一邊更新畫面,一邊又能受使用者操作,如果沒有線程,在等待使用者輸入的時候就會卡住(block),直到使用者輸入完才回繼續。線程讓兩件事能同時進行。
在每個作業系統中,有提供不同的線程的函式庫,在linux等posix作業系統,有pthread可使用,在這裡我是選用跨平台的glib提供的gthread作為範例。
搭建開發平台我想是初學者最不容易學習的過程,搭建完成後打幾行程式按下F9倒是簡單。不過這個搭建的過程讓你再調用其他函式庫也能順利完成。
首先要先下載一些壓縮檔,http://www.gtk.org/download/win32.php,下載all-in-one bundle,顧名思義,所有東西都在裡面。
把它解壓縮。
接下來用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;
}
這只是一個簡單的範例,線程還有其他更複雜的知識跟功能,如果大家有找到更多的資料歡迎提供。


Reply all
Reply to author
Forward
0 new messages