核心元件‎ > ‎

執行緒

執行緒原理很複雜,但製做卻非常簡單,只要繼承自 IcxxlThread 並實作一個叫 ThreadStart() 的函數,就是一個執行緒類別了,至於內容要如何設計,完全自由,完全依靠程式師的創意。ThreadStart() 是執行緒啟動後第一個要執行的函數,而從 ThreadStart() 離開就表示這個執行緒結束了。建立好執行緒物件,並做好設定,就可以交給 Thread_Create() 完成啟動,把物件交給 Thread_Create() 後會維持一份擁有,所以即使被原擁有者放棄,執行緒仍在執行。

執行 ThreadStart() 的執行緒叫做任務執行緒,以等待其他執行緒叫用,其他執行緒一般都是以非同步的方式使用執行緒物件,當然這只是一般性的用法,怎麼使用並無規則可言,只有一點要注意,一定要善用關鍵區域保護資料,並且注意別造成死鎖。
 

以下是綜合了執行緒、關鍵區域閘門...等的應用例子,主執行緒把使用者輸入的每段文字交給 Msg 物件的 Lists,Msg 的任務執行緒會每 3 秒從 Lists 取出一段文字並顯示,使用者打 exit 結束任務執行緒,打 quit 結束範例程式

範例一

#include <iostream>
#include <list>
#include <string>
#include <windows.h>  // 為了使用 Sleep()
#include <GATE.HPP>
#include <CXXLTHREAD.HPP>
#include <SMART_PTR.HPP>
using namespace std;
using namespace CxxlMan; 
class Msg:virtual:public IcxxlThread
{
  Gate haveMsg;
  CriticalSec csObject;
  list<string> str_lists;
public:
  Msg(ISpirit *spirit = Spirit_Easy) 
   :cxxlObject(spirit)
  {
  }
  virtual ~Msg()
  {
  }
  // 啟動執行緒後的進入點
  void cxxlFASTCALL ThreadStart(void)
  {
    bool F = true;
    while(F)
    {
      haveMsg.Wait();
      csObject.Enter();
      while (!str_lists.empty())
      {
        string str = str_lists.back();
        str_lists.pop_back();
        csObject.Leave();
        if(str == "exit")
          F = false;
        else
        {
          cout << str << endl;
          Sleep(3000);
        }
        csObject.Enter();
      }
      csObject.Leave();
    }
  }
  void Print(string S)
  {
    csObject.Enter();
    str_lists.push_front(S);
    haveMsg.Signal();
    csObject.Leave();
  }
};
int main(int argc, char* argv[])
{
  // 主執行緒須用 Smart_Ptr 擁有一份,
  // 否則由任務執行緒結束返回時會執行放棄擁有程序,
  // 若沒有擁有者會被 delete 
  Smart_Ptr<Msg> Msg_Ptr(new Msg);
   
  Thread_Create(Msg_Ptr);
  string Str;
  while(true)
  {
    cin >> Str;
    Msg_Ptr->Print(Str);
    if(Str == "quit")
      break;
  }
  system("pause");
  return 0;
}
 
 
 
引入檔

CXXLTHREAD.HPP 

程式庫

cxxlobject

 
 
 
 
 
Comments