Unity – 簡易的 main thread & other thread 互動

給想用多執行緒, 但又需要和 unity 互動的人有個粗淺的測試環境/方式~

概念很單純, 在主執行緒裡面放一份清單, 定期檢查是否有委託的"任務",
通常可用來處理「xxx can only be called from the main thread」這類的錯誤.
反之, 也可以從 main thread 委託其他 thread 處理東西~


// main thread 的處理者
class MainThreadTaskMan : MonoBehaviour
{
       public static MainThreadTaskMan Singleton { get; set; }
       Queue<Action> mThreadTaskOnMain = new Queue<Action>();
       void Awake()
       {
              // 確保不死
              DontDestroyOnLoad(this);
              Singleton = this;
       }
       void Update()
       {
              // 記得先 lock 住核心資料(常用作法)
              lock (mThreadTaskOnMain)
              {
                     if (mThreadTaskOnMain.Count < 1)
                           return;
                     // 取出
                     var task = mThreadTaskOnMain.Dequeue();
                     // 執行
                     task();
              }
       }
       // 通常是給非主執行緒的地方呼叫, 當然這種作法也可以在主執行緒委託呼叫
       public void AddTask(Action task)
       {
              // 記得先 lock 住核心資料(常用作法)
              lock (mThreadTaskOnMain)
              {
                     mThreadTaskOnMain.Enqueue(task);
              }
       }
}

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.